Как читать n целых чисел из стандартного ввода в C ++? - PullRequest
11 голосов
/ 18 октября 2011

Мне нужно прочитать что-то вроде:

5 60 35 42
2 38 6
5 8
300 1500 900

А затем сохраните первую строку в массиве. После вызова других функций сделайте то же самое со следующей строкой и т. Д.

Я пытаюсь с помощью gets(), а затем использую sscanf() для сканирования целых чисел из строки, но я не знаю, как прочитать n чисел из строки.

Ответы [ 7 ]

24 голосов
/ 18 октября 2011

C ++

Если у вас есть неизвестное количество записей, разбросанных по неизвестному количеству строк, оканчивающихся на EOF:

int n;
while(cin >> n)
  vector_of_int.push_back(n);

Если у вас есть известное количество записей, разбросанных понеизвестное количество строк:

int n;
int number_of_entries = 20; // 20 for example, I don't know how many you have.
for(int i ; i < number_of_entries; ++i)
  if(cin >> n)
    vector_of_int.push_back(n);

Если у вас есть неизвестное количество записей в одной строке:

std::string str;
std::getline(std::cin, str);
std::istringstream sstr(str);
int n;
while(sstr >> n)
  vector_of_int.push_back(n);

Если у вас есть неизвестное количество записей, распределенных по известному количествустроки:

for(int i = 0; i < number_of_lines; ++i) {
  std::string str;
  if(std::getline(std::cin, str)) {
    std::istringstream sstr(str);
    int n;
    while(sstr >> n)
      vector_of_int.push_back(n);
  }
}
9 голосов
/ 18 октября 2011

Я уже видел такие входные файлы для соревнований.Если скорость больше важна, чем обнаружение ошибок, вы можете использовать пользовательскую процедуру.Вот пример, аналогичный тому, который я использую:

void readintline(unsigned int* array, int* size) {
    char buffer[101];
    size=0;
    char* in=buffer;
    unsigned int* out=array;
    fgets(buffer, 100, stdin);
    do {
        *out=0;
        while(*in>='0') {
            *out= *out* 10 + *in-'0';
            ++in;
        }
        if (*in)
            ++in; //skip whitespace
        ++out;
    } while(*in);
    size = out-array;
}

Он разрушит вашу память, если в строке будет более 100 символов или больше чисел, чем может вместить массив, но вы не получите более быстрой процедурычитать строки без знака.

С другой стороны, если вы хотите просто:

int main() {
    std::string tmp;
    while(std::getline(std::cin, tmp)) {
        std::vector<int> nums;
        std::stringstream ss(tmp);
        int ti;
        while(ss >> ti) 
            nums.push_back(ti);
        //do stuff with nums
    }
    return 0;
}
4 голосов
/ 18 октября 2011

Я бы, наверное, написал код примерно так:

// Warning: untested code.
std::vector<int> read_line_ints(std::istream &is) { 
    std::string temp;
    std::getline(is, temp);

    std::istringstream buffer(temp);
    int num;
    std::vector<int> ret;

    while (buffer>>num)
        ret.push_back(num);
    return ret;
}
3 голосов
/ 18 октября 2011

Быстрое решение - прочитать их с scanf()

int array[1000];
int index = 0;

while ((index < 1000) && (scanf("%d", &tmp) == 1)) {
    array[index++] = tmp;
}

Это все еще требует дополнительной проверки ...

3 голосов
/ 18 октября 2011

В C ++ вы можете использовать std::istringstream.

std::string nums = "1 20 300 4000";
std::istringstream stream(nums);
int a, b, c, d;
stream >> a >> b >> c >> d;
assert(a == 1 && b == 20 && c == 300 && d == 4000);

. Если вы хотите получить его из стандартного ввода, сделайте то же самое, но просто используйте std::cin

std::cin >> a >> b >> c >> d;
2 голосов
/ 18 октября 2011

C ++:

vector<int> ints;
while( !cin.eof() )
{
   int t;
   cin >> t;
   if ( !cin.eof() )
      ints.push_back(t);
}

Альтернатива (спасибо Шахбазу)

int t;
vector<int> ints;
while(cin >> t)
   ints.push_back(t);
0 голосов
/ 18 октября 2011

В C ++ очень просто читать N целых чисел, разделенных пробелами, через stdin:

#include <iostream>

using namespace std;

const unsigned N = 5;

int main(void)
{
   int nums[N];

   for (unsigned i = 0; i < N; ++i)
      cin >> nums[i];

   cout << "Your numbers were:\n";

   for (unsigned i = 0; i < N; ++i)
      cout << nums[i] << " ";

   cout << "\n";

   return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...