scanf()와 % s의 정확한 문제에 부딪혔습니다. 얼마나 많은 입력이 있는지 모르면 어떻게됩니까?
char mystring[0];
을 실행하면 프로그램이 올바르게 컴파일됩니다. 그러나 당신은 항상 segfault 것입니다. 크기가 0 인 배열을 만들므로 배열에 을 넣으려고하면 배열에 즉시 할당됩니다 (메모리가 할당되지 않으므로 문자열 범위를 벗어납니다) - segfault입니다.
그래서 1 점 : 항상 문자열의 크기를 할당해야합니다. char *mystring
대신에 char mystring[0]
라고 말하고 싶은 상황은 거의 없습니다 (알 수 없음, 전혀 없음).
다음으로 scanf를 사용할 때 "% s"지정자를 사용하지 않으려합니다. 문자열의 크기를 경계 검사하지 않기 때문입니다. 그래서 당신이 경우에도 :합니다 (512th이 \ 0 때문에) 사용자가 넘는 511 개 문자를 입력
char mystring[512];
scanf("%s", mystring);
경우, 당신은 당신의 배열의 범위 밖으로 이동합니다.이를 해결하는 방법은 다음과 같습니다
이
scanf("%511s", mystring);
이 모두 C 당신이 기대하는 것보다 더 많은 입력이있는 경우 자동으로 문자열의 크기를 조정하는 기능이 없다는 말을하는 것입니다. 이것은 수동으로해야 할 일입니다.
이 문제를 처리하는 한 가지 방법은 fgets()을 사용하는 것입니다.
당신은 말할 수 :
이
while (fgets(mystring, 512, stdin))
{
/* process input */
}
그런 다음 4 자 후 길이 5의 문자열로, mystring
위의 코드를 사용해보십시오 구문 분석 sscanf를()를 사용할 수 있습니다 읽은, 그 코드 나머지 입력을 검색하기 위해 다시 반복합니다. "처리 중"은 문자열을 더 큰 크기로 재 할당 한 다음 fgets()에서 최신 입력을 추가하는 코드를 포함 할 수 있습니다.
위의 코드는 프로그램 루프를 만들고 무한 문자열 길이를 처리하므로 내부 하드 제한이 필요합니다 (예 : 최대 10 회 루프).
% s은 (는) 전체 문자열이 아닌 단어를 읽도록 추가되어야합니다. scanf 형식 문자열은 공백과 개행 문자를 구분 기호로 사용하기 때문입니다.이 경우, 대신에 % c를 사용하십시오 (필드 너비와 함께) 또는 fgets를 사용하십시오. 필드 너비가있는 % c의 경우 전체 버퍼 문자열을 0으로 초기화해야합니다. –
프로그램이 항상 segault되지는 않습니다. 실제로, 아마 대부분의 시간. 프로그램이 자동으로 중단됩니다. 사랑스러운 C가 아닌가요? :-) –