2015-06-16 2 views
-1

Я heve следующего кодаЧто такое опции scanf vs получает vs fgets?

while (a != 5) 
scanf("%s", buffer); 

Это хорошо работает, но занимает не пространства между указанными словами или другими словами, зсап заканчивается, если использовать пробел для сканирования

Если я использую этот

while(a != 5) 
scanf("%[^\n]", buffer); 

Он работает только один раз, что плохо

Я никогда не использую gets(), потому что я знаю, как много я противный т есть ..

Мой последний вариант это

while(a != 5) 
    fgets(buffer, sizeof(buffer), stdin); 

Так что мои вопросы

  1. Почему вторая команда не работает внутри цикла?
  2. Какие еще параметры я должен сканировать строку с пробелами?
+1

Что такое 'a'? где это меняется? Что это за первоначальное значение?Что ты пытаешься сделать? – harald

+0

Я бы пошел с третьим вариантом, а затем обрезал новую строку, как показано [здесь] (http://stackoverflow.com/a/28462221/3386109) – user3386109

+0

Во всех трех случаях проверка возвращаемого значения 'scanf()/fgets() 'необходимо перед использованием' buffer'. – chux

ответ

1

"%[^\n]" будет пытаться сканировать все до новой строки. Следующим символом на входе будет \n, поэтому вы должны пропустить его, чтобы перейти к следующей строке.

Попробуйте: "%[^\n]%*c", %*c отбросит следующий символ, который является символом новой строки.

+0

''% [^ \ n] "' имеет проблемы. Попробуйте ввести только новую строку - «буфер» не изменяется, остается как есть - возможно, неинициализирован. Такая же проблема с '"% [^ \ n]% * c "' – chux

+0

Хорошо? но предположение состоит в том, что есть текст для обработки, поэтому он не имеет значения. – AzNjoE

1

Почему вторая команда не работает внутри цикла

Becuase, в первый раз, что вы сканирования до \n, то \n будет остающегося в буфере ввода. Вы должны съесть (или, другими словами, отбросить) сохраненную новую строку из буфера. Вы можете использовать while (getchar()!= \ n );, чтобы выполнить эту работу.

Какие еще варианты я должен сканировать строку с пробелами?

Ну, вы почти у цели. Вы должны использовать fgets(). Используя это, вы можете

  1. быть защищены от переполнения буфера (Преодолеть ограничение gets())
  2. ввода строки с пространств (Преодолеть ограничение %s)

Однако, пожалуйста, имейте в виду, fgets() читает и сохраняет конечную новую строку, поэтому вы можете избавиться от нее, и вы должны сделать это самостоятельно, вручную.

+0

sorry bro моя ошибка, третья функция не fscanf, только ее fgets..a простая опечатка ... –

+0

'scanf()' + '% s' также имеет ту же проблему, что и # 1. – cremno