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

时间:2019-05-16 07:31:05

标签: c++ arrays string

我想输入一行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;
}

2 个答案:

答案 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

  • i = 0和isdigit(inputstr[i])是的,您从 ss 中提取了 11 并将其放入arr[0]
  • i = 1和isdigit(inputstr[i])是,您从 ss 中提取 22 并将其放入arr[1]
  • i = 2,isdigit(inputstr[i])isalpha(inputstr[i])均为假
  • i = 3和isdigit(inputstr[i])是的,您从 ss 中提取了 33 并将其放在arr[3]中,但没有将arr[2]中的值具有未定义的值
  • i = 4和isdigit(inputstr[i])是,您尝试从 ss 中提取 int ,但是流引用了 AB ,没有提取任何内容,流出现错误并且没有清除错误,您将无法从中读取某些内容
  • for 的末尾,由于流出错,您什么也不做,因此不会设置 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 $ 

答案 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,然后读取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