2014-11-14 5 views
1

while 루프를 사용하여 C에서 char 배열의 길이를 계산하려고합니다. 그러나 을 삽입하면 5 길이가 반환됩니다. 4 옳은 대답일까요?C에서 char 배열의 길이

char eingabe[255]; 

printf("geben Sie eine Zeile ein:"); 
fgets(eingabe, 255, stdin); 

int i = 0; 
while (eingabe[i] != '\0') 
{ 
    ++i; 
} 

printf("Laenge: %d\n", i); 
+5

줄 바꿈 문자 (' n). 'man fgets'을 읽으십시오. –

+6

'fgets'는 줄 끝 부분에 줄 바꿈 문자를 유지하므로 "otto"에 4를 더한 것입니다. –

+3

왜 strlen()을 다시 구현합니까? –

답변

8

eingabe에 포함 된 매우 높습니다 :

{ 'o', 't', 't', 'o', '\n', '\0', junk ... } 
7

확인 man pagefgets()의는.

EOF 또는 개행 후에 읽기가 중지됩니다. 개행을 읽으면, 버퍼에 저장됩니다. 만약 stdin로부터 판독됨에

는 그것이 제공하는 버퍼 또한 후단 newline [\n] 문자를 저장한다.

수표를 while ((eingabe[i] != '\0') && (eingabe[i] != '\n'))으로 변경하십시오. 희망이 당신의 문제를 해결할 것입니다.

1

줄 바꿈 문자 '\n'은 읽기를 중지하지만 함수에 의해 유효한 문자로 간주되며 결과에 복사 된 문자열에 포함됩니다. 당신이이 문제를 방지하려는 경우,이 같은 fscanf을 사용

fscanf(stdin, "%254[^\n]", eingabe); 

참고 한계를 형식에 : 그것은 null 종결을 수용 할 수있는 버퍼의 실제 길이보다 작습니다.

참고 : strlen을 사용하여 문자열의 길이를 계산할 수 있습니다. 그것은 당신의 for 루프와 같은 일을한다 : 당신은 당신이 strlen를 사용해야합니다 거기에 초기화 된 문자 수를 원하는 경우

eingabe의 크기는 지금 255
int i = strlen(eingabe); 
0

. 하지만 먼저 다음 코드를 삽입하십시오.

int n; 
for(n = 0; n < 255; n++){ 
    if(eingabe[n] == '\n'){ 
    eingabe[n] = '\0'; 
    } 
} 
eingabe[254] = '\0'; 

이 코드는 '\ n'문자를 NULL 문자로 바꿉니다. 이 값이 없으면 strlen은 잘못된 값을 반환합니다. 나는 또한 eingabe[254] = '\0';을 포함하므로, 읽은 문자열이 버퍼에 맞지 않을만큼 길면 strlen이 제대로 작동 할 수 있도록 여전히 NULL 문자가 있습니다.