我目前正在尝试通过将字符串重新定义为数字来将一组整数保存在 int 数组中,然后将其存储在数组中
Posted
技术标签:
【中文标题】我目前正在尝试通过将字符串重新定义为数字来将一组整数保存在 int 数组中,然后将其存储在数组中【英文标题】:I am currently trying to save a set of integers in a int array, by redefining string into numbers, then store it in the array 【发布时间】:2019-05-08 16:12:07 【问题描述】:我正在尝试转换输入文本/数字(字符串),其中将包含任何字符,但我想将数字与字符分开并将它们存储到整数数组中,一旦它从字符串转换。
我认为问题在于使用stoi()
将字符串转换为整数,但我似乎无法发现问题。
目前,代码接受任何输入并将其转换为字符串,然后逐个字符检查字符串,并将所有没有逗号或空格分隔的数字加在一起,一旦逗号或空格或任何其他字符将数字分开,将数字作为一个整体添加到数组中,然后继续检查字符串是否有更多数字。
有什么想法吗? 输入示例 1:12、13、15 输入示例 2:12 13 15 输入示例3:12ab13cd15ef
整数数组的结果:0[12] 1[13] 2[15] 通过使用数组中的数字,这些数字将按特定顺序使用。
#include<iostream>
#include<string>
#include <sstream>
using namespace std;
int main()
string datainput, str1, str3;
cin >> datainput;
int n = 0, raycount = 0, c;
int myray[10];
while (datainput[n])
if (datainput[n] == ('0') || datainput[n] == ('1') || datainput[n] == ('2') || datainput[n] == ('3') || datainput[n] == ('4') ||
datainput[n] == ('5') || datainput[n] == ('6') || datainput[n] == ('7') || datainput[n] == ('8') || datainput[n] == ('9'))
str1 = datainput[n];
str3 += str1;
else
c= stoi(str3);
c >> myray[raycount];
raycount++;
n++;
cout << myray[0] << endl;
cout << myray[1] << endl;
cout << myray[2] << endl;
cout << myray[3] << endl;
system("pause");
return 0;
【问题讨论】:
【参考方案1】:我发现您的代码存在很多问题。
在 C++11 之前,一旦n
到达字符串末尾,while (datainput[n])
就会有未定义的行为。
使用std::isdigit()
可以大大简化检查数字的方式,甚至可以使用>=
和<=
运算符进行简单的范围检查。
您没有正确考虑由其他字符分隔的数字,或者当字符串中的最后一个数字位于字符串的末尾时。
语句c >> myray[raycount];
需要改为myray[raycount] = c;
。如果raycount
达到myray[]
的最大容量,您并没有打破循环。
在使用 std::stoi()
将其转换后,您不会将 str3
重置回空白字符串。您只需将新数字添加到先前数字的末尾,数字之间没有中断。
话虽如此,请尝试更多类似的东西:
#include <iostream>
#include <string>
using namespace std;
int main()
string datainput, str3;
cin >> datainput;
int myray[10];
int raycount = 0;
bool gettingDigits = false;
for (int n = 0; n < datainput.size(); ++n)
char ch = datainput[n];
//if (isdigit(ch))
if (ch >= '0' && ch <= '9')
if (!gettingDigits)
str3 = "";
gettingDigits = true;
str3 += ch;
else
if (gettingDigits)
myray[raycount] = stoi(str3);
raycount++;
str3 = "";
gettingDigits = false;
if (raycount == 10) break;
if (gettingDigits && (raycount < 10))
myray[raycount] = stoi(str3);
raycount++;
for (int n = 0; n < raycount; ++n)
cout << myray[n] << endl;
system("pause");
return 0;
Live Demo
或者:
#include <iostream>
#include <string>
using namespace std;
int main()
string datainput, str3;
cin >> datainput;
int myray[10];
int raycount = 0;
string::size_type start = datainput.find_first_of("0123456789");
string::size_type end;
while (start != string::npos)
end = datainput.find_first_not_of("0123456789", start+1);
if (end == string::npos)
str3 = datainput.substr(start);
myray[raycount] = stoi(str3);
raycount++;
break;
str3 = datainput.substr(start, end-start);
myray[raycount] = stoi(str3);
raycount++;
if (raycount == 10) break;
start = datainput.find_first_of("0123456789", end+1);
for (int n = 0; n < raycount; ++n)
cout << myray[n] << endl;
system("pause");
return 0;
Live Demo
【讨论】:
感谢您的意见!我已经应用了您建议的一些更改,这是朝着正确方向迈出的一步。也非常感谢其他使代码更容易的方法。重置字符串和整数似乎可以解决堆叠问题,但我仍然坚持将所有数字堆叠到数组中,并将字符串转换为数字。我将浏览您发布的代码,看看是否可以进一步解决我的问题。 :-) @Daniel 如果您能编辑您的问题以显示您正在输入的实际输入以及预期结果应该是什么样子,那将会很有帮助。 我添加了 3 个示例,应该会产生相同的结果。 @Daniel 我更新了我的答案。我的第一个示例中有一个错误,我已修复。【参考方案2】:因此,您希望将数字和字符分隔到不同的数组中。 在 if 块中,您正在检查字符,所以,我怀疑 stoi() 不起作用。 最好将其类型转换为整数。
int temp[10];
if (datainput[n] == ('0') || ...)
temp[n] = int(datainput[n]);
这样您的临时数组将包含数字。
【讨论】:
如果您能告诉我为什么这个答案被否决,我将不胜感激?谢谢。以上是关于我目前正在尝试通过将字符串重新定义为数字来将一组整数保存在 int 数组中,然后将其存储在数组中的主要内容,如果未能解决你的问题,请参考以下文章
GraphQL & Mongoose Schema - 如何将一组 mongoose objectId 引用存储到另一种类型?