Проблема с назначением ввода в строку, массив int и int - PullRequest
0 голосов
/ 16 мая 2019

Я хочу взять строку ввода int1 int2 ... intn FUNCTIONINITIAL param1 param2.int1-intn будет храниться в массиве int, functioninitial будет содержать два альфа-символа, а param1 и param2 будут храниться в двух разных целых числах.

Проблема, с которой я сталкиваюсь, заключается в том, что мой код не работает для 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 голосов
/ 16 мая 2019

Вы добирались туда, и хотя я согласен с 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
0 голосов
/ 16 мая 2019

Doing

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];
}

Ваш для символа прогресса на символ, в то время как элементы чтения имеют более 1 символа, а также есть разделители, ваши тесты isXXX не соответствуют следующему элементу чтения, и, конечно, элементов меньше, чем количество символов в строке.Использование индекса i , используемого для inputtr для ввода значений в arr , также неверно, вы не можете использовать один и тот же индекс для обоих

Дляэкземпляр с входными данными 11 22 33 AB 44 55:

  • i = 0 и isdigit(inputstr[i]) true, вы извлекаете 11 из ss и помещаете его в arr[0]
  • i = 1 и isdigit(inputstr[i]) true, вы извлекаете 22 * ​​1032 * из ss и помещаете его в arr[1]
  • i = 2и isdigit(inputstr[i]) и isalpha(inputstr[i]) ложны
  • i = 3 и isdigit(inputstr[i]) true, вы извлекаете 33 из ss и помещаете его в arr[3] и вы не поместили значение в arr[2] с неопределенным значением
  • i = 4 и isdigit(inputstr[i]) true, вы пытаетесь извлечь int из ss но поток ссылается на AB , ничего не извлечено, поток находится в состоянии ошибки и не устраняя ошибку, вы не сможете прочитать что-то из него
  • до конца для вы ничего не делаете, потому что поток находится в состоянии ошибки, поэтому 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 $ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...