2014-01-29 3 views
4

이 코드는 사용자로부터 입력 된 정수 (t)를 사용합니다. 루프는 't'번 실행됩니다. 하지만 나는 그것이 (t-1) 번 실행됩니다 찾으십시오. 예를 들어, 내가 입력 3 줄 경우에만 2 번 실행됩니다. 아무도 이것이 왜 일어나는지 설명해 주시겠습니까?이 루프가 몇 번 실행됩니까?

scanf("%s", &str)을 사용해 보았지만 작동하지만 공백이 포함 된 입력 문자열을 사용할 수 없습니다. 그것은 단지 때문에 \n 문자 번째 반복에서 판독 된 버퍼 gets 남긴 이유 2 회 반복되는 것을 보인다 should.But로

#include <stdio.h> 
int main() 
{ 
    int t; 
    scanf("%d", &t); 
    while(t--) 
     { 
     char str[100]; 
     gets(str); 
     printf("%s\n", str); 
     } 
    return 0; 
} 
+2

절대로'gets' 함수를 사용하지 마십시오; 본질적으로 안전하지 않으며 최신 언어 버전에서 제거되었습니다. 'fgets'는 안전하게 사용할 수 있지만 좀 더 복잡합니다. –

+0

루프 본문은't' 번 실행됩니다. – typ1232

답변

2

scanf("%d", &t)은 입력 스트림에서 숫자 만 사용하고 나머지 문자는 남겨 둡니다. 숫자를 입력하고 Enter 키를 누르면 숫자 뒤에 개행 문자가 생깁니다.

첫 번째 gets은이 개행을 읽고 개행을 제외하고는 비어있는 문자열을 반환합니다. 루프의 첫 x 째 반복은이 공 i 행을 인쇄합니다.

1

루프 3 회 반복된다.
첫 번째 반복의 경우 문자열과 언로드를 입력 할 때 을 입력하면 \n 문자가 문자열과 함께 버퍼로 이동합니다. gets\0을 만나면 읽기를 멈추고 버퍼에는 \n을 남깁니다. 다음 반복에서이 \n (인쇄 할 수없는 문자)은 gets으로 읽은 다음 터미널에 인쇄됩니다.


참고 : gets 기능을 절대로 사용하지 마십시오. 더 이상 표준 C의 일부가 아닙니다. 대신 fgets을 사용하십시오.

0

SPACE 뒤에 문자열이 허용되지 않는 문제를 해결하기 위해 scanf 함수를 사용할 수도 있습니다. 또한 버퍼가 gets() 사용으로 인해 지워지지 않으므로 루프는 (t-1) 번 실행됩니다. 이 문제를 해결하려면 getch() 함수를 사용하여 버퍼를 지울 수 있습니다. 다음 코드는, 내 생각 작동합니다

#include <stdio.h> 
int main() 
{ 
    int t; 
    scanf("%d", &t); 
    while(t--) 
    { 
     char str[100]; 
     scanf("%[^\n]c",&str); 
     printf("%s\n", str); 
     getch(); 
    } 
return 0; 

}이 코드에서

getch()는 쓸모없는 값을 받아 들여 버퍼를 지 웁니다. 또한 scanf()까지 고려하면 ^ 안에있는 scanf은 문자 입력이 ^ 다음에 오는 문자까지 걸릴 필요가 있음을이 경우에는 NEW LINE의 이스케이프 시퀀스입니다. 나는 개행 문자 대신에 작은 단어를 사용해 보았지만 잘 작동했다. 희망이 당신의 문제를 해결합니다 :)

관련 문제