2014-04-06 2 views
1

코드가 실행될 때마다 for 루프 내의 내용이 처음으로 실행되지 않습니다. 즉 i = 0 일 때입니다. 그러나 루프는 i = 0 이후에, 즉 i = 1,2,3, .. n-1에 대해 실행된다. 아무도 여기서 무엇이 잘못 됐는지 설명 할 수 있습니까?C 언어 : 입력 문자열 검색이 for 루프 내에서 건너 뜁니다.

#include <stdio.h> 
#include <stdlib.h> 
int main(int argc, char** argv) { 
    char string[30][100]; 
    int n,i; 
    scanf("%d",&n); 
    for(i=0;i<n;i++){ 
     gets(string[i]); 
     printf("%s\n",string[i]); 
    } 
    getch(); 
    return (EXIT_SUCCESS); 
} 
+2

'는 scanf ("% d 개", &n); getchar가(), 즉 ' "% d 개"') – BLUEPIXY

+4

을 먹거나 //위한 "% d \ n", &n);'도 같은 일을 할 것입니까? –

+0

@JoachimPileborg'는 scanf ((은'scanf' 형식 코드 뒤에 공백을 추가 단지 newline' – Dabo

답변

-1
for(i=0;i<n;i++) 
{ 
    fflush(stdin); //Clears the buffer.insert this here. 
    gets(string[i]); 
    printf("%s\n",string[i]); 
} 

scanf("%d",&n);의 실행 후에는 떠나 '\n' 다른 입력 작업의 실행 전에 취소해야 buffer.Which의 문자 (당신은 마지막에 Enter 키를 누를 때). fflush(stdin) 키보드 버퍼를 지 웁니다. 그것을 할 많은 다른 방법이 있습니다. 그러나 fflush(stdin)을 사용하면 초보자도 쉽게 할 수 있습니다.

+2

Windows에서는'fflush (stdin)'만 사용할 수 있습니다. 다른 곳에서는 정의되지 않은 동작입니다. C 표준에 다음과 같이 명시되어 있습니다 (ISO/IEC 9899 : 2011 §7.21.5.2'fflush' 함수). _ 스트림이 출력 스트림 또는 가장 최근의 조작이 입력되지 않은 업데이트 스트림을 가리키는 경우 'fflush' 함수는 그 스트림에 대한 쓰기되지 않은 데이터를 호스트 환경에 전달하여 파일에 기록합니다. 그렇지 않은 경우, 동작은 undefined._ –

+0

입니다. 또한, 프로그램은 *** gets()를 안전하게 사용할 수 없습니다. 오용이나 남용으로부터 스스로를 보호 할 수는 없습니다. 최초의 인터넷 웜 (Google에서 'morris internet worm'검색, 1988 년에 발생한)에서 사용 된 공격 중 하나는'gets() '를 사용하는 코드를 사용했습니다. 그것은 더 이상 표준 C가 아닙니다 (정당한 이유로 C11에서 삭제되었습니다). –

0

할 수 있습니다 중 시스템은 n의 값에 입력 누른 후 그 이유는 자동 증가 대신이 일시 정지, 그래서 나는 어떠한 시스템 일시 정지 및 한 프로그래머없는 scanf와 뒤에 공백을 떠나보십시오

scanf("%d ", &n); 

또는 루프가 여전히 다수 이동하지만 동시에 1을 추가한다 N 동일까지 0이 될 수 있도록 바로 동일한 루프를 유지 : 시스템가 입력 루프의 값이 자동으로 간주 입력 "n"은

for(i=0;i<=n;i++) 

첫 번째 옵션은 프로그램의 다른 부분에서 "n"을 사용해야 할 수도 있으므로 사용하는 것이 훨씬 현명하다는 점에 유의하십시오.

+0

프로그램이 대화식 인 경우,''% d "'와 같은 형식으로 후행 공백을 남기지 마라 ** 그 후행 공백은 불운 한 사용자가''% d ''를 입력 할 때까지'scanf() 숫자 다음의 공백이 아닌 (탭이 아닌, 개행이 아닌) 문자. –

+0

@JonathanLeffler 당신이 그것을 언급 해 주셔서 감사합니다. 버퍼를 지우는 것 외에 다른 방법이 있는지 알고 있습니까? – Rage91

+0

최악의 경우 최악의 경우 :'void gobble_to_newline (FILE * fp) {int c; while ((c = getc (fp))! = EOF && c! = '\ n'); }', 표준 입력에만 튜닝 된 인라인 함수로 작성 될 수 있습니다 : static inline void gobble_stdin_to_newline (void) {int c; while ((c = getchar())! = EOF && c! = '\ n'); }'. 내 코드에서 'while'조건 다음에 오는 세미콜론은 루프 본문이 비어 있다는 것을 강조하기 위해 자체 라인에 있습니다. 의견에 표시하기가 어렵습니다. –

관련 문제