2014-11-10 4 views
1

У меня есть задание, когда на языке программирования C мне нужно сканировать несколько цифровых (просто целое, если оно не целое, оно должно выйти) значений с клавиатуры. Значения делятся на пробел, а вход заканчивается EOF. Мне нужно продолжить работу с этими отсканированными значениями. Я знаю максимум числа, набранных, я заранее не знаю, сколько цифр я получу.vC: сканировать числовой ввод до тех пор, пока EOF

Я пробовал:

while (scanf("%d", &a) == 1 && count <= 10000) { 
    eof=a; 
    if (eof=getchar() == EOF) break; 
... 

Но это не похоже на работу, как мне нужно (часто вы должны дать EOF в два раза, но не всегда, а иногда добавляет 0 к входу). То же самое происходит, когда я использую только:

while (scanf("%d", &a) == 1) { 

если я пытаюсь:

while (... && (a=getchar()) != EOF) { 

переменная а переписывается, и я не могу с ним работать дальше.

Заранее спасибо.

EDIT: Кроме того, мне нужно различать EOF и недопустимого ввода (что-то другое, чем номер), который я не уверен, как это сделать, потому что

scanf(...)==1 

не будет делать эту работу.

+1

При вызове 'getchar' в цикле вы получите неправильные значения при вызове' Scanf'. –

+0

Что касается различий между различными результатами ['scanf'] (http://en.cppreference.com/w/c/io/fscanf), просто сохраните его возвращаемое значение в переменной и проверьте его. –

+0

Сохранение возвращаемого значения из 'scanf' в переменной и проверка его по отдельности работает, это похоже на лучшее решение. Благодаря! – Luga

ответ

0

Обратите внимание, что результат scanf() будет 0, 1, или EOF.

int count = 0; 
int a; 
int scnt; 
while ((scnt = scanf("%d", &a) != EOF && count < 10000) { // not <= 10000 
    if (scnt == 0) { 
    // Handle stdin with unconvertible input. OP wants "it should exit" 
    puts("Bad"); 
    exit (-1); 
    } else { 
    // Success! Let's print it 
    printf("%d %d\n", count++, a); 
    } 
} 
// why did we quit? 
if (count >= 10000) 
    puts("Too many"); 
else if (feof(stdin)) { 
    puts("EOF detected"); 
else if (ferror(stdin)) { // rare 
    puts("IO error on detected"); 
else // Should never occur 
    puts("???"); 
-1

Вместо сканирования целых чисел, прочитайте всю строку сразу, используя, например, fgets, а затем получить номер из этого.

Тогда вы можете легко просто поместить вызов fgets в состояние цикла и не нуждаться в какой-либо другой проверке.


Если fgets нецелесообразно использовать, то как насчет вложенных циклов, один внешний, который заканчивается, на конец файла условие (специальный флаг установить), и внутренний, который использует, например, getchar, чтобы прочитать все символы. Если getchar возвращает EOF, вы устанавливаете флаг для внешнего цикла и выходите из внутреннего цикла.

Конечно, это означает, что у вас есть синтаксический анализ и сопоставление чисел, но если вам не придется обрабатывать большие числа, которые могут обрабатываться стандартными стандартными типами, тогда это тривиально.

+0

Это не сработает для меня: 1) Я не знаю длины этой строки (она может быть от 5 до более 15000 символов), 2) поскольку это школьное задание, программа будет работать в ограниченной среде. и я не уверен, что переменная такая большая будет возможна в этой среде (но я полагаю, нет: /) – Luga

+0

@Luga Обновленный ответ с другим возможным решением. –