2016-12-29 10 views
0
main() 
{ 
char name[20]; 

printf("enter your name\n"); 

scanf("%s",name);  
printf("%s",name); 

gets(name); 
puts(name); 
} 

입력 : Sampad 사하 Sampad 사아puts 및 gets 함수는 어떻게 작동합니까?

여기두고

출력

gets() 찍은 입력을 사용한다. 나는이 printf()를 생략하면

는 같은 출력은 그래서 여기

사하

scanf()을 통해 주어진 아무것도 인쇄되지 않습니다두고있다.

main() 
{ 
char color[20]; 

printf("enter your name\n"); 

scanf("%s",color); 
puts(color); 
} 

그러나 여기 puts()scanf()에서 가져온 입력을 사용합니다.

여기
+6

무엇이 질문입니까? – ForceBru

답변

4

문제는,

ABC XYZ

코드

scanf("%s",name); 

같은 입력 은 "ABC"부분과 "XYZ"를 읽어 입력 버퍼에 남아 있습니다. 나중에 gets() 읽고 그 puts() 인쇄합니다. 당신이 printf()newline을 가지고 있지 않기 때문에, 출력이되지 않습니다 플러시와 puts()의 결과는 출력 스트림 버퍼에을 추가 하고 프로그램이 실행을 완료하면, 전체 출력 버퍼는 인쇄 모두 플러시 전체 입력. 당신이 printf()을 삭제할 때

은 그래서, 다른 경우, 값은 scanf() ("ABC") 인쇄되지 않습니다 읽을.

%sscanf()으로 공백으로 구분 된 입력을 읽을 수 없으므로 첫 번째 공백에서 읽기가 중단됩니다.

인용문 C11. 장 §7.21.6.2

s         비 공백 문자의 순서와 일치합니다. [...]

제 공백이 발생한 때 판독 %s, scanf() 정지 들면 나타낸다.입력이없는 포함될 공백이 (즉이없는 공백 구분 입력이 주어진다) scanf() 모두 따라서 (개행 종료 개까지)을 전체 입력을 판독하여 수행하는 제 2 케이스 오는

printf()puts()은 동일한 결과를 출력합니다.

즉, DO NOT use gets(), it is dangerous입니다. 대신 fgets()을 사용하십시오.

+0

내가 잘못했거나 옳은지 알지 못한다. 그러나 같은 경우에 사용되는 변수가 있기 때문에 Saha를 인쇄하는 인쇄 생략 사례 (두 번째 예)가 아닌가? 그리고 처음에는'gets()'에서 읽음으로써 잃어 버리기 전에 출력 버퍼에 저장됩니다. 세 번째 경우는 명백합니다 .. – coderredoc

+0

@coderredoc'pf/sf'와'gets/puts' 쌍이 사용하는 한 같은 변수, 그것은 동일합니다. 쌍 사이의 변수는 변경 될 수 있지만 결과는 변경되지 않을 수 있습니다. :) –

+0

ok .. 감사합니다. 나는 그것을 올바르게 얻었다. – coderredoc