2016-07-04 2 views
0

이름을 표시하고 입력하고 Enter 키를 누르면 프로그램이 중지됩니다.배열에 ' 0'을 넣으면 scanf와 get이 다르게 작동합니까?

#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); 
    } 
} 

을하지만 scanf와 사용하려고하면 : 아래의 코드에서 나는 (더 이상 사용되지 않습니다 "도착"내가 아는)를 올바르게 결과를 얻을

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

조건을 name[0]=='\0'은 결코이 시간 사실입니다. 왜? '\0'은이 기능에서 다르게 작동합니까?

+0

'Enter 키'가 '\ n'이기 때문에 – Shank

+0

http://stackoverflow.com/questions/26391465/why-is-adding-a-leading-space-in-a-scanf-format-string-recommended check @ Shank comment –

+0

감사합니다, Olivier. – Ricardo

답변

1

scanf이 변수에 값을 할당 할 수 없으면 (입력 스트림에 공백이 있고 '문자열'을 종료하므로) 값을 지우지 않습니다. 그 이유는 부분적으로 모든 변수가 명백한 '명확한'상태를 갖는 것은 아니기 때문입니다.

따라서 scanf 이후에는 nome에 이전에 포함 된 내용이 포함됩니다. scanf가 반환 값을 테스트하여 변수를 할당 할 수 있는지 확인해야합니다 : if (scanf(...) == 1) - 'scanf가 하나의 변수를 성공적으로 할당 했습니까?'라는 의미입니다.

+0

내가이 이름을 표시 할 수있는 이름을 몇 개 붙이면 scanf가 작동했음을 의미합니다. 하지만 입력 (문자 없음)을 입력하면 프로그램이 종료되지 않습니다. 그래서 '\ 0'은 "name"배열에 없습니다. 그거야? – Ricardo

+0

예, '\ n'은 scanf에 _stop reading_을 알리고 이름에 복사하지 않고 _stops_합니다. – Aganju

+0

독서가 중단 되나요? 제 경우에는 실제로 그렇지 않았습니다. –

-1

"scanf"를 사용하면 변수가 문자열이 아니지만 "gets"변수가 "gets"에 자동으로 '\ 0'을 넣기 때문에 변수가됩니다.