将输入分配给字符串,int数组和int的问题

Problem about assigning input to a string, int array and int

本文关键字:int 数组 问题 输入 分配 字符串      更新时间:2023-10-16

我想采取输入int1 int2 ... intn functioninitial param1 param2。int1 to intn将存储在int数组中,功能性将包含两个alpha字符,而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;
}

您要到达那里,而我同意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值,直到您的读取失败functionss.clear();清除failbit,然后读取functionpara1para2,验证每个读取的成功。

示例使用/输出

$ ./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

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 每个字符的进度字符,而读取元素的字符超过1个字符,并且还有分隔符,您的测试 isxxxx 与下一个读取元素不一致,当然,元素比字符串中的字符数少。要使用用于 inputstr 将值放入 arr 中的索引 i 也是错误的

例如使用输入11 22 33 AB 44 55

  • i = 0和 isdigit(inputstr[i])是的,您提取 11 ss 中,然后将其放在arr[0]
  • i = 1 and isdigit(inputstr[i])是的,您提取 22 ss 中,然后将其放在arr[1]
  • i = 2,isdigit(inputstr[i])isalpha(inputstr[i])都是false
  • i = 3和 isdigit(inputstr[i]) true,您从 ss 中提取 33 ,然后将其放入arr[3]中,并且您没有在具有不确定值<的arr[2]中放置一个值>
  • i = 4和 isdigit(inputstr[i])是的,您尝试从 ss 提取 int 流正在错误,没有清除错误,您将无法从中读取某些内容
  • 直到的末端,您什么都不做,因为流正在错误,所以不会设置 function ,并且将保持空
  • 循环后,流仍在错误,您将无法设置_Param18和 param2 ,其价值保持不确定

只需读取号码,而您可以拥有您的功能,然后再次阅读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 $