【问题标题】:How to split an array using strings?如何使用字符串拆分数组?
【发布时间】:2016-01-28 01:39:19
【问题描述】:

我需要编写一个程序,提示用户输入一个字符串,然后确定字符串的中间位置,并生成一个新的字符串,将字符串的两半交换,然后输出结果。

目前为止

int main(void) {

char *string = NULL;
char temp[1000];
cout << "Please enter a string" << endl;
cin.getline(temp, 999);
int length = strlen(temp);
string = new char[length];
strcpy(string,temp);
length = length / 2;

    return EXIT_SUCCESS;
}

它接收字符串并存储它。我只需要一种将后半部分移动到新数组的方法,我知道我需要使用 strcpy() 但我不知道如何正确引用数组的那部分。

【问题讨论】:

  • 看看strncpy。但是,您应该尝试改用std::string 和标准算法。
  • 有没有办法让 strncpy 在 n 之后开始获取数组?还是只会在 n 之前执行?
  • 在开始弄清楚算法之前,您可能需要修复所示代码中的明显错误,该错误将导致未定义的行为、内存损坏和随机崩溃(提示:strlen() 不会计算 strcpy() 添加的尾随 '\0')。
  • 想想什么是数组。它衰减为一个指针,因此您可以递增指针以指向数组的中间。
  • @Tremors 您可以使用&amp;string[n]n 开始复制。

标签: c++ string c-strings


【解决方案1】:

由于这是 C++,我将建议一个标准库算法。您要求交换序列的两半,std::rotate 就是这样做的。不幸的是,它会就地进行旋转,而您希望结果是不同的字符串。

您可以复制字符串然后进行旋转,但是有一个std::rotate_copy 算法可以同时进行(并且比单独的复制/旋转步骤更快)。

char 数组示例:

#include <algorithm>
#include <cstring>
#include <iostream>

int main()
{
    char text[1000], result[1000];
    std::cout << "Please enter a string\n";
    std::cin.getline(text, 999);
    size_t length = strlen(text);

    std::rotate_copy(text, text + length / 2, text + length, result);
    result[length] = '\0';

    std::cout << text << '\n' << result << '\n';
}

std::string 为例:

#include <algorithm>
#include <iostream>
#include <string>

int main()
{
    std::string text, result;
    std::cout << "Please enter a string\n";
    std::getline(std::cin, text);
    size_t length = text.size();

    result.resize(length);
    std::rotate_copy(text.begin(), text.begin() + length / 2, text.end(), result.begin());

    std::cout << text << '\n' << result << '\n';
}

Demo on ideone.com

您可以使用std::swap_ranges,但前提是这两个范围的大小相同。

【讨论】:

    【解决方案2】:

    如果您尝试使用 C,请使用 strncpy。但是,我建议使用 C++ std::string 并使用 std::string.substr() 和连接。后者至少对我来说会更容易。

    【讨论】:

      【解决方案3】:

      您已经完成了解决方案的一半。在这里,我使用 strncpy 来获取前半部分并使用指针递增来获取第二部分。

      #include <iostream>
      #include <cstring>
      #include <cstdlib>
      
      using namespace std;
      
      int main(void)
      {
          char temp[1000];
          cout << "Please enter a string" << endl;
          cin.getline(temp, 999);
          int length = strlen(temp);
      
          char firstHalf[512];
          strncpy (firstHalf, temp, length/2);
          cout << "firstHalf: " << firstHalf << endl;
      
          char* secondHalf = temp + length/2; 
          cout << "secondHalf: " << secondHalf << endl;
      
          char* swapped_str = strcat(secondHalf, firstHalf);  
          cout << "Swapped string: " << swapped_str << endl;
      
          return EXIT_SUCCESS;
      }
      

      【讨论】:

      • 这更像是一个 c 风格的答案(使用 )而不是一个 cpp 答案。我同意@jalomas7 并会亲自使用 来解决这个问题。
      【解决方案4】:
      std::string text(whatever...);
      int sz = text.size() / 2;
      for (int i = 0; i < sz; ++i)
          std::swap(text[i], text[sz + i]);
      

      text.size() 为奇数时,这可能会减一。

      【讨论】:

        猜你喜欢
        • 2018-06-03
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 2013-01-14
        • 2018-04-04
        • 2022-01-04
        相关资源
        最近更新 更多