如何使用字符串拆分数组?

Posted

技术标签:

【中文标题】如何使用字符串拆分数组?【英文标题】: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 开始复制。 【参考方案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() 为奇数时,这可能会减一。

【讨论】:

以上是关于如何使用字符串拆分数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何拆分字符串数组,然后将该拆分数组的每个第一个索引与字符进行比较?

将字符串拆分为字符串数组[重复]

如何拆分camelCase字符串并检查每个拆分词是不是是数组的一部分?

如何将字符串拆分为javascript数组? [复制]

如何拆分字符串数组?

如何在awk中将分隔字符串拆分为数组?