我想输入一行int1 int2 ... intn FUNCTIONINITIAL param1 param2。从int1到intn将存储在一个int数组中,functioninitial将包含两个字母字符,而param1和param2将存储在两个不同的int中。
我面临的问题是我的代码不适用于3位或以上的数字。在我的以下代码中,如果我的输入为11 22 33 AB 44 55
,则可以正常工作。但是,如果我将输入更改为111 222 333 AB 444 555
,则无法正常工作。我知道问题出在for循环i = i + 2,但是我不知道如何使我的函数使用不同的数字。谁能帮我修复我的代码?
#include <sstream>
#include <iostream>
#include <string>
using namespace std;
int main(){
string inputstr;
string function;
int arr[100] = {0};
int i = 0;
int para1;
int para2;
stringstream ss;
getline(cin, inputstr);
ss << inputstr;
for(i=0;i<inputstr.length();i+= 2){
if(isdigit(inputstr[i])){
ss >> arr[i];
cout<<"int: "<<arr[i]<<endl;
}
else if(isalpha(inputstr[i])){
ss>>function;
break;
}
}
ss>>para1;
ss>>para2;
cout<<"parameter1: "<<para1<<endl;
cout<<"parameter2: "<<para2<<endl;
cout<<"function: "<<function<<endl;
}
答案 0 :(得分:0)
做
for(i=0;i<inputstr.length();i++){ if(isdigit(inputstr[i])){ ss >> arr[i]; cout<<"int: "<<arr[i]<<endl; } else if(isalpha(inputstr[i])){ function += inputstr[i]; }
每个字符的 for 进度字符,而读取的元素有多个字符,并且还有分隔符,您的测试 isXXX 与下一个读取的元素不一致,当然,元素少于字符串中的字符数。要使用用于 inputstr 的索引 i 将值放在 arr 中也是错误的,您不能为两者使用相同的索引
例如,输入为11 22 33 AB 44 55
:
isdigit(inputstr[i])
是的,您从 ss 中提取了 11 并将其放入arr[0]
isdigit(inputstr[i])
是,您从 ss 中提取 22 并将其放入arr[1]
isdigit(inputstr[i])
和isalpha(inputstr[i])
均为假isdigit(inputstr[i])
是的,您从 ss 中提取了 33 并将其放在arr[3]
中,但没有将arr[2]
中的值具有未定义的值isdigit(inputstr[i])
是,您尝试从 ss 中提取 int ,但是流引用了 AB ,没有提取任何内容,流出现错误并且没有清除错误,您将无法从中读取某些内容在可以读取号码的同时,您将拥有自己的功能,然后再次读取2个数字
我还建议您使用 std :: vector 而不是数组
示例:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
// read ints
vector<int> v;
int i;
while (cin >> i)
v.push_back(i);
// not an int, is the FUNCTIONINITIAL
string function;
cin.clear(); // clear error
if (! (cin >> function))
// EOF
return -1;
int param1, param2;
if (! (cin >> param1 >> param2))
// not numbers or EOF
return -1;
// debug
cout << "ints are";
for (auto n : v)
cout << ' ' << n;
cout << '\n' << function << '(' << param1 << ',' << param2 << ')' << endl;
}
编译和执行:
pi@raspberrypi:/tmp $ g++ -pedantic -Wall -Wextra c.cc
pi@raspberrypi:/tmp $ ./a.out
11 22 33 AB 44 55
ints are 11 22 33
AB(44,55)
pi@raspberrypi:/tmp $
答案 1 :(得分:0)
您到达那里,而我同意bruno和使用std::vector
的情况下,可以使用您的基本类型数组进行操作:
#include <iostream>
#include <sstream>
#include <string>
#define MAXN 100
int main (void) {
std::string inputstr, function;
int arr[MAXN], i, n = 0, para1, para2;
std::stringstream ss;
if (!getline (std::cin, inputstr)) { /* validate read of line */
std::cerr << "user canceled or input error.\n";
return 1;
}
ss << inputstr; /* transfer line to stringstream */
while (n < MAXN && (ss >> arr[n])) /* read ints until function */
n++;
ss.clear(); /* clear failbit */
if (!(ss >> function)) { /* validate read of function */
std::cerr << "error: no function read.\n";
return 1;
}
if (!(ss >> para1) || !(ss >> para2)) { /* validate read of 2 params */
std::cerr << "error: failed to read 2 parameters.\n";
return 1;
}
/* output function (para1, para2) followed by integer values */
std::cout << '\n' << function << "(" << para1 << ", " << para2 << ")\n";
for (i = 0; i < n; i++)
std::cout << " " << arr[i];
std::cout << '\n';
}
无论您使用vector
还是int arr[]
,方法都是相同的。读取存储的int
值,直到在function
上读取失败。 ss.clear();
清除failbit
,然后读取function
,para1
和para2
,从而验证每次读取是否成功。
使用/输出示例
$ ./bin/fnparams
111 222 otherFunc 333 444
otherFunc(333, 444)
111 222
或
$ ./bin/fnparams
1 22 333 4444 55555 secretFunc 66 777
secretFunc(66, 777)
1 22 333 4444 55555