операторы scanf () (и cin) пропускаются при использовании gcc - PullRequest
2 голосов
/ 17 сентября 2008

Если в коде встречается несколько операторов scanf(), то, за исключением первого оператора scanf(), все остальные операторы пропускаются, то есть при запуске кода не запрашивается ввод этих операторов scanf() .

Я попробовал несколько предложений. Например, на каком-то сайте было предложено использовать flushall(), но это приводит к ошибке компиляции.

Любая помощь с благодарностью.

[Код был добавлен как ответ .]

Ответы [ 6 ]

3 голосов
/ 17 сентября 2008

Проверьте возвращаемое значение scanf ()!

со страницы руководства: «scanf возвращает количество назначенных элементов ввода, которое может быть меньше, чем предусмотрено, или даже ноль, в случае сбоя сопоставления. Ноль указывает, что, хотя вход был доступен, преобразования не были назначены; недопустимый вводимый символ, такой как буквенный символ для преобразования «% d». Значение EOF возвращается, если произошел сбой ввода перед любым преобразованием, таким как конец файла. Если ошибка или конец файла происходит после начала преобразования, возвращается число успешно завершенных преобразований. "

2 голосов
/ 18 сентября 2008

Пример ввода кода и определенно улучшит нашу способность помочь вам в решении вашей конкретной проблемы, поскольку существует множество потенциальных ситуаций, которые могут вызвать проблему.

Пример (я могу думать быстро):

  • Строка формата не соответствует следующему символу во входном потоке. Таким образом, scanf ничего не читает.
  • Входной буфер stdin сбрасывается только при заполнении или при возврате.
  • Ввод из 1 строки ввода может использоваться несколькими операторами scanf. Последующие операторы scanf начинают с того места, где остановился последний. Таким образом, программа не останавливается для пользовательского ввода.
  • % s ведет себя по-разному на scanf и printf
    printf печатает целую строку.
    просканируй, прочитай ОДИН слово, разделенное пробелом
0 голосов
/ 14 сентября 2011

всегда используйте "" fflush (stdin); "" перед любым "scanf ();" оператор, потому что до тех пор, пока вы не очистите стандартный поток ввода, оператор scanf будет считывать уже существующее значение в стандартном вводе-выводе i / p.

0 голосов
/ 07 мая 2010

Код простой, как он есть:

#include <stdio.h>
int main()
{
long int z,s,n,i,j,m,x;
scanf("%ld ",&z);
for(i=0; i<z; i++)
  {
  scanf("%ld",&s); n=0;
  for (j=0; j<s; j++) { scanf("%ld",&m); n+=m; }
  x=n+s-1;
  printf("%ld\n",n);
  }
return 0;
}

Компиляция:

D:\edycja>gcc WSEGA.c -o WSEGA.exe -Wall

D:\edycja>WSEGA.exe

D:\edycja> [Where was the program!?]
0 голосов
/ 17 сентября 2008

Это звучит как проблема конверсии. Может случиться так, что преобразование% s никогда не заканчивается, или вы указываете символ, который никогда не вводится, или что-то в этом роде. Я предлагаю следующее: а. Попробуйте что-то вроде: int a = 0; int b = 0; scanf ("% d", & a); scanf ("% d", & b); printf ("a =% d, b =% d \ n", a, b); Если это работает, попробуйте увеличить число конверсий, чтобы узнать, какая из них вызывает проблему.

0 голосов
/ 17 сентября 2008

Я всегда думал, что scanf () опасен, так как может оставить ваши входные потоки в неопределенном состоянии.

Я предпочитаю использовать другие (более безопасные) команды для ввода строки (fgets и тому подобное), а затем использовать sscanf для ее обработки. Затем вы всегда можете вернуться к началу строки и перезапустить.

...