你如何用一个未知大小的后半部分交换数组的前半部分

时间:2015-01-28 21:09:52

标签: c++ arrays string swap

我试图将用户获得的某些字符串数组的前半部分与后半部分交换,而不知道数组的大小。这是我的尝试。

#include <iostream> 
#include <cstring>

using namespace std;

int main() {

int size;

char string1[size]; 
char *string1Ptr;

cout << "Please enter a string: ";
cin.getline(string1, size);

for (int i = 0; i < size; i++){
    string1Ptr = &string1[i];
    int n = 0;
    if(*string1Ptr == '\0') {
        n = i / 2;
        strcpy(string1, string1+n);
        strcat(string1, string1);
    }
}

cout << string1 << endl;

return EXIT_SUCCESS; 
}

2 个答案:

答案 0 :(得分:2)

虽然这可能是家庭作业,但这是学习标准库的绝佳机会。你正在做的只是一个简单的轮换,并且有一个algorithm

std::rotate(string1, string1 + std::strlen(string1) / 2,
            string1 + std::strlen(string1));

完成你所需要的一切,抛弃你容易出错的循环!

此外,您应该使用const int size = somesize或更好std::string代替char[]。如果您使用后者,请使用std::string::size代替strlen

答案 1 :(得分:0)

使用 strlen(string1)查找变量 string1 的长度。

也许您应该考虑使用c ++功能来完成您想要的工作。

使用 std :: string 类比 char数组方法更灵活,因为它可以读取任意数量的字符并且不会被分隔大小变量。

#include <iostream>
#include <string>

using namespace std;

int main() {

  string string1;
  getline(cin, string1); // Here, string 1 contains all the characters until a newline character is found.

  // Get the string length
  int n = string1.length();

  // Swaps the first half with the second half.
  string swapped_string = string1.substr(n/2, n/2 + 1) + string1.substr(0, n/2);

  cout << swapped_string << endl;

  return EXIT_SUCCESS;
}

您的代码段有一些问题可能没有考虑过。

  1. 未初始化变量 size
  2. 您无法使用非const变量定义固定大小的数组。 ( char string1 [size]
  3. 如果(strlen(string1)&gt; size / 2)
  4. strcpy()将复制到 string1 的已分配内存之外缓冲区溢出。
  5. 当您输入 if()语句时,您应该使用语句 break; 来终止 for()循环,因为那时你是完成了与阵列的后半部分交换前半部分。