2014-10-18 2 views
0

나는 이것을 위해 fgets()을 사용하고 있습니다. 그러나 이전 루프에서 현재 루프에 남은 부분이있는 것으로 보입니다. 그러나 나는 루프 안에 input을 선언한다. 그래서 모든 루프마다 새로운 배열이 아닌가?루프에서 사용자 입력을 읽음

int nn=0; 
    while (1) { 
    printf("%d\n", nn); 
    if(++nn==3)break; 
    char input[101]; 
    char* pch; 
    printf("|%s|\n", input); 
    fgets(input, 101, stdin); 
    input[strlen(input) - 1] = '\0'; 
    printf("|%s|\n", input); 
    pch = strtok (input," "); 

    if(!strcmp(pch, "l")) { 
     pch = strtok (NULL, " "); 
     readFile(pch, rec, N, buckets, towns); 
    } 
    else if(!strcmp(pch, "e")) { 
     printf("Exiting...\n"); 
     return; 
    } 
    else { 
     printf("Unknown command. Exiting...\n"); 
     return; 
    } 
    } 

출력 :

0 
|| 
l t200.bin 
|l t200.bin| 
Records found in file 200 
1 
|l| 
l t200.bin 
|l t200.bin| 
Records found in file 200 
2 

나는 새 명령이 먹다 남은 음식이 input에 보관 특히, 이전에 휩쓸 리게 될 것이다 봉사 할 걱정입니다.

+0

초기화되기 전에'input'을 출력합니다; 'NULL '을 반환하지 않는 한'fgets'를 호출 한 후에 만 ​​의미있는 내용을 갖습니다 (확인하지 않음). –

+0

'char input [101];'->'char input [101] = ""; – BLUEPIXY

+0

"은 모든 루프에서 새로운 배열이 아닌가?" - 개념적으로 만; 실제로는 대부분의 구현에서 동일한 메모리입니다. –

답변

1

그러나 이전 루프에서 현재 루프에 남은 부분이있는 것처럼 보입니다. 그러나 루프 내부에 입력을 선언하므로 모든 루프마다 새로운 배열이 아닌가?

루프에 범위를 입력 할 때마다 각 반복마다 정의되지 않은 내용이있는 배열이 있습니다. 그것이 함수에서 선언 된 로컬 배열이 작동하는 방식입니다. 따라서 루프를 통과 한 첫 번째 패스에는 이론적으로는 input이 포함될 수 있습니다. 귀하의 경우 그것은 효과적으로 빈 문자열로 일어난 ...하지만 그건 필요하지 않습니다. 후속 반복 은 이전 콘텐츠가있는 일이 발생했으나 다시 필요하지는 않습니다. 아무 것도 포함 할 수 있습니다. 배열은 다음 C 세계적으로 를 선언 된 경우 요소가 기본 값으로 설정됩니다

참고 :

효과적으로 "지고 있지만

Why are global and static variables initialized to their default values?

는 '새'(초기화) 배열마다 모든 루프 ", 그것은 당신이 실현하는 것이 중요합니다 "모든 루프가 오래된 배열을 잃고 ". 이 경우 어레이가 각 반복에서 동일한 메모리 주소를 얻게 될 가능성이 있지만 이는 보장 할 수는 없습니다. 루프 밖에서 선언 된 포인터에 배열 주소를 저장할 수 없으며 이후 반복에서 동일하게 유지됩니다.

-1

당신은

printf("|%s|\n", input); 

하나는 입력에 읽기 전에 한 후 두 인스턴스가; 첫 번째 코드를 제거하면 코드가 설정되기 전에 input에 액세스하므로 정의되지 않은 동작이 발생합니다.

은 모든 루프마다 새로운 배열이 아니십니까?

개념적으로 만; 실제로는 대부분의 구현에서 스택과 동일한 메모리 (스택에 할당 됨)입니다. 이것이 이전 반복의 결과를 보는 이유입니다. 첫 번째 반복에서는 스택에있는 모든 쓰레기 (아마도 NUL)를 인쇄합니다. 실제로 모든 반복에서 새로운 배열을 할당하는 구현에서는 모든 반복마다 쓰레기가 인쇄되거나 프로그램이 중단 될 수 있습니다. 다시 정의되지 않은 동작입니다.

또한 fgets가 EOF 또는 오류를 나타내는 NULL을 반환하는지 확인하고 'e'만 읽는 경우가 아니라면 루프를 종료해야합니다. fgets가 NULL을 반환 한 후 input의 내용은 불확정합니다.

+1

그 downvote는 분명히 근거가 없습니다. 여기에 나쁜 배우가 있습니다. –

관련 문제