2011-04-12 4 views
1

왜 다음과 같은 C 코드가없는 입력이C 포인터 문제!

#include<stdio.h> 
#include<stdlib.h> 
void get_length(char s[]); 
int main() 
{ 
char buff[128]; 
printf("\nEnter buffer data: "); 
scanf("%s",buff); 
get_length(buff); 
} 

void get_length(char *s){ 
    int count; 
for(count = 0 ; *s != '\0' ; s++) 
    count++; 
printf("count = %d\n",count); 
} 

10 OUPUT하지 않습니다 나는 출력
수 = 432
사람이 그것을 설명해 할 수있다 Rohit
입니다.

+0

문자열에 필드 제한 너비를 넣어야합니다. 그렇지 않으면 거대한 입력 데이터 (예 : % s 대신 % s)와 충돌 할 수 있습니다. –

답변

5

scanf 형식 문자열에 % 대신 5이 표시됩니다. 키보드의 시프트 키를 청소해야 할 수도 있습니다.

즉, scanf은 실제로 버퍼에 아무 것도 읽지 않습니다. 코드에서 scanf (반환해야 함)의 반환 값을 확인하지 않으므로 오류가 발생하지 않습니다. 그래서 당신은 ... 초기화되지 않은 쓰레기로 가득 찬 버퍼의 길이를 계산하려고합니다. 그것은 당신에게 432, 또는 0, 또는 무엇보다도 다른 것을 줄 수 있습니다.

[추가 예정 :] ... 오. 그리고 수정 한 경우에도 scanf은 줄 바꿈 문자를 포함하여 공백 문자을 볼 수 없으므로 읽기가 중단되고 따라서 get_length 함수가 찾고있는 함수가 버퍼에 없을 것이므로 읽기가 중단됩니다.

덧붙여 C 표준 라이브러리의 strlen 기능에 대해 알고 계십니까?

+0

%도 변경되지 않습니다. 변경 한 실수입니다. – station

+0

무엇을 변경 했습니까? 여기의 코드는 여전히'scanf ("5s", buff); 'scanf ("% s", buff);라고 말하면 똑같은 잘못된 결과가 나옵니까?(''% 5s ''라고 말하면''% 5s ''라고 변경하면 다른 이유로 실패 할 것입니다 : 테스트 입력에서 버퍼는'I am '을 포함하고 영숫자가 끝나고 어떤 쓰레기도 들어 있습니다 'buff' 이전에는 ... 그리고 get_length 함수가 찾고있는 개행이 없습니다.) –

+0

개행 문자가 버퍼에 저장되지 않기 때문에 실제로 5가 없더라도 실패 할 것입니다. 그것은 공백 문자입니다. 답변이 적절하게 수정되었습니다. –

1

잘못된 형식을 사용했기 때문에 scanf 호출에 실패했습니다. 길이가 5 인 문자열을 원할 경우 "5s"이 아닌 "%5s"이 아니면 전체 오타 인 경우 "%s"이 아니면 안됩니다. 따라서 문자 버퍼가 초기화되지 않고 스택에 첫 번째 임의 문자 '\n' 문자가 발생하기 전에 바이트 수를 얻고 있습니다. 또한 scanf은 개행 문자를 무시합니다. 따라서 get_length 함수는 예상대로 작동하지 않습니다.

+0

실제로. 단, 그는 'NULL'을 스캔하는 것이 아니라 개행을 스캔하는 것입니다. 몹시 놀라게 하다. –

+1

나는 5가 길이가 아니기를 바랐다. 대부분의 키보드에서'%'= shift-'5' ... :-) –

+0

@Tomalak 예, 나는 그것을 보았고 그것을 이미 바로 잡았습니다. –

3

나는 이 아니라 5s을 의미한다고 생각합니다.

귀하의 배열 (char buff[128] = {})을 값 초기화하면 배열이 제한되지 않습니다 (count = 432은 임의로 사용 가능).

그런 다음 get_length — C 스타일의 문자열에, *s != '\0'하지 \n 확인해야는 사용자 입력에서 데이터를 걸렸다 관계없이 NULL 문자 (\0)이 아닌 줄 바꿈에 의해 제한된다. 그 입력으로부터 개행 문자가 없어집니다.

+0

% 또한 차이를 만들지 않습니다. 변경 한 실수입니다. – station

+0

@ user567797 : 귀하의 실제 문제는 마지막 단락에 있습니다. 읽어 봤니? –

1

scanf가 문자열을 읽고 마지막 문자를 '\ 0'으로 설정한다고 생각하지만 '\ n'을 검색하고 있습니다. scanf 구현에서 암시 적이라고 생각하지 않습니다.

즉, '\ n'대신 '\ 0'을 확인하십시오.