сканирование строки в с - PullRequest
0 голосов
/ 27 декабря 2011
   int main( )
    {
        char str[200];
        int n,tc;
        scanf("%d",&tc);
        while(tc--)
         {
           scanf("%d",&n);
           gets(str);
           puts(str);
        }
    return 34;
    }

Почему этот код не сканирует нет. строк (str) равно tc?
Платформа UBUNTU 10.04

Ответы [ 3 ]

3 голосов
/ 27 декабря 2011

Вот что я получаю на своей машине:

vovanium@microvovanium:~/tmp$ cc whoa.c 
whoa.c: In function ‘main’:
whoa.c:4: warning: incompatible implicit declaration of built-in function ‘scanf’
/tmp/cc1r5dZe.o: In function `main':
whoa.c:(.text+0x4b): warning: the `gets' function is dangerous and should not be used.
vovanium@microvovanium:~/tmp$ ./a.out 
3
12qwe
qwe
34asd
asd
56zxc
zxc

Так что, похоже, сканирует.

Кажется, вы используете K & R C, но это не очень хорошая идея.Используйте стандарт ANSI / ISO C.

  1. Там нет #include <stdio> и запуска программы.Нужно использовать scanf(), gets() и puts().Это особенно необходимо при использовании функций с переменными аргументами, таких как printf и scanf (и, таким образом, мой компилятор жалуется).
  2. Вы не объявили типы параметров для main ().У Main есть прототип int main(int argc, char *argv[]).
  3. Вы использовали параметры функции в качестве локальных переменных, лучше объявить их в теле функцииВы должны иметь: int tc; и int n; сразу после {.
  4. Возможное значение, возвращаемое из main (), определяется в <stdlib.h> и может быть EXIT_SUCCESS или EXIT_FAIL или обычно использоваться0 или 1 (конечно, вы можете использовать другие значения, но вы должны убедиться, что они значимы в вашей среде.
1 голос
/ 27 декабря 2011

Я понял, ошибка в строке

 scanf("%d", &n);

Требуется место после% d

 scanf("%d ", &n);
1 голос
/ 27 декабря 2011

Позволяет разбить код на одну строку за раз (более или менее):

scanf("%d",&tc);

читает целое число в tc.

while(tc--)

loop tc times

    scanf("%d",&n);

читает целое число в n

    gets(str);

читает остальную часть строки в str, удаляя завершающий символ новой строки

    puts(str);

, печатает строку, после чего следуетновая строка

Итак, вы читаете целое число, а затем читаете столько целых + остальные пары строк и распечатываете строки (но не целые числа - они выбрасываются).Чтение целого числа включает пропуск любого пустого пространства (пробелов, табуляции и целых пустых строк) перед целым числом, но не после него, так что это может немного сбить с толку, в зависимости от того, какой ввод вы вводите в программу.

В вашем примере вы говорите, что вводите ему ввод:

3
4
anil kuma
2
abc
4
ams

Итак, давайте пройдемся по программе и посмотрим, что она делает:

  • readцелое число 3 в tc
  • цикл 3 раза
  • (первый цикл)
    • чтение 4 в n
    • чтение остальной части строки(пусто) в str,
    • выведите пустую строку
  • (второй цикл)
    • попробуйте прочитать целое число в n, ноinput (anil kuma) не является целым числом, поэтому устанавливает флаг ошибки на stdin
    • для чтения остальной части строки (anil kuma) в str
    • print anil kuma
  • (третий цикл)
    • читать 2 в n
    • читать остаток строки (пустой) в str
    • напечатать пустую строку
  • цикл завершен, код завершения возврата 34.

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

Вы можете получить вывод, более похожий на ожидаемый, изменив ваши вызовы scanf на:

scanf("%d ", &n);

Обратите внимание на дополнительный пробел после% d преобразование, которое заставляет scanf считывать и выбрасывать пустое пространство, пока не найдет непробельный символ.Это заставит его выбросить символы новой строки после целых чисел, а также любые последующие пустые строки и любые пробелы / символы табуляции в начале следующей непустой строки

...