如何使用字符串拆分数组?
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 您可以使用&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 风格的答案(使用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()
为奇数时,这可能会减一。
【讨论】:
以上是关于如何使用字符串拆分数组?的主要内容,如果未能解决你的问题,请参考以下文章
如何拆分字符串数组,然后将该拆分数组的每个第一个索引与字符进行比较?