의 선언은 20 문자의 배열을 지정합니다 : a[0]
부터 까지입니다. a[20]
이 범위를 벗어났습니다 : a[20]=getchar();
.
getchar
은 int
을 반환합니다. 문자가 아닌 문자 EOF
을 유효한 문자 값과 구별하기 위해 이렇게합니다. 모든 양의 반환 값은 문자입니다. 어떤 음의 값은 오류입니다 ...하지만 에 반환 값을 저장하려면 int
및 오류를 처리하기 위해 음수 값이 인 int를 확인하십시오!
int c = getchar();
if (c < 0) {
fputs("Read error while reading from stdin", stderr);
return EXIT_FAILURE;
}
a[19] = c; /* Don't rely on this being a string, since a string is a sequence of
* characters ending at the first '\0' and this doesn't have a '\0'.
* Hence, it isn't a string. Don't pass it to any str* functions! */
마찬가지로, 당신은 아마는 scanf에서 오류를 처리해야합니다 말도
switch (scanf("%d", &b)) {
case 1: /* excellent! 1 means that one variable was successfully assigned a value. */
break;
case 0: fputs("Unexpected input while reading from stdin; "
"The \"%d\" format specifier corresponds to decimal digits.", stderr);
return EXIT_FAILURE;
default: fputs("Read error while reading from stdin", stderr);
return EXIT_FAILURE;
}
if (a=="ilangeeran")
입니다. 어느 책을 읽고 있니?
이 코드에는 여러 가지 잘못된 점이 있습니다. 솔직히 말하면 쉽습니다. * 이와 같이 코딩하지 마십시오. (1)'main()'에 대한 묵시적인 리턴 타입. (2)'main()'에서 리턴 값 *이 없습니다. (3) 부적절한 어레이 "비교". 내가 제시하는 싱글 바이트 스택 오버런을 수정하기 전에 * 모든 코드를 컴파일하는 코드를 얻는 것이 더 중요 할 것이다. – WhozCraig
우선 bounds를 통해 배열을 수행합니다 [20] = getchar(). 또한 문자열을 잘못 비교하는 경우 strcmp (a, "ilangeeran")를 사용하여 문자열을 비교해야합니다. – user2181624
의도적으로'a [20] = getchar();을 사용하여 정의되지 않은 동작을 호출하지 않아도됩니다. –