2016-07-04 3 views
0

Я получаю и показываю имена и останавливаю программу при вводе ключа ввода. В коде ниже я получаю правильно результат (я знаю, что «получает» устарел):Сканирует и по-разному работает над put ' 0' в массиве?

#include <stdio.h> 

main() 
{ 
    char name[50]; 

    while(1) 
    { 
     printf("Name: "); 
     scanf("%s", name); 

     if(name[0]=='\0') 
      break; 
     else 
      printf("Name entered: %s\n", name); 
    } 
} 

Но когда я пытаюсь использовать зсап:

printf("Nome: "); 
scanf("%s", nome); 

Условия name[0]=='\0' никогда не правда на этот раз. Зачем? '\0' работает по-разному в этих функциях?

+0

Потому что 'Enter Key' является' \ n' – Shank

+0

http://stackoverflow.com/questions/26391465/why-is-adding-a-leading-space-in-a-scanf-format-string-recommended check это, чтобы понять @Shank комментарий –

+0

Спасибо, Оливье. – Ricardo

ответ

1

Если scanf не может присвоить значение переменной (поскольку входной поток имеет пробел, завершающий «строку»), он не очищает его; причина в том, что не все переменные имеют очевидное «ясное» состояние.

Итак, после вашего сканирования f nome все еще содержит все, что содержалось ранее. Вам нужно проверить, удалось ли scanf назначить переменную вместо этого, проверив ее возвращаемое значение: if (scanf(...) == 1) - что означает, что «действительно ли scanf успешно назначил одну переменную?»

+0

Если я помещаю несколько имен, я могу отобразить это имя, это означает, что scanf работал. Но когда я печатаю ввод (без символов), программа не заканчивается. Поэтому я думаю, что '\ 0' не находится в массиве "name". В том, что? – Ricardo

+0

Да, '\ n' сообщает scanf _stop reading_, и он не копирует его в имени, это _stops_. – Aganju

+0

Не перестает читать? В моем случае на самом деле этого не произошло. –

-1

Использование переменной «scanf» не становится строкой, но с «получает» переменная (имя) становится строкой, потому что «получает» автоматически помещает «\ 0» в нее?