문제

버퍼가 있고 버퍼가 보유 할 수있는 것보다 더 많은 문자를 입력하는 것을 원하지 않습니다 (버퍼 오버런을 피하기 위해).

나는 사용 중입니다 scanf 그리고 다음과 같이했습니다.

char buffer[30] = {'\0'};
scanf("%30s", buffer);

그러나 사용자가 30 명 이상으로 들어가면 보호된다는 것을 알고 있습니다. 그러나 사용자가 30 명 이상을 입력하면 버퍼가 Null이 종료됩니까?

도움이 되었습니까?

해결책

scanf() "%S"변환 지정자를 사용하면 버퍼에 종단 Null 문자를 추가합니다.

하지만, 당신은 30자를 요구하는데, 이는 실제로 31을 의미하며 30 개만 공간 만 있습니다. 최대 필드 너비 29를 사용해야합니다.

char buffer[30] = {'\0'};
scanf("%29s", buffer);

또한 변환 지정자도 마찬가지입니다 "%c" 거의 좋아합니다 "%s", 그러나 종단 null 문자를 추가하지 않으며 입력에서 공간을 폐기하지 않습니다. 당신이 기대하는 것에 따라 "%s"를 사용하는 것보다 낫습니다.

char buffer[30] = {'\0'};
scanf("%29c", buffer);
buffer[29] = '\0';

다른 팁

로부터 scanf 수동:

에스 백인이 아닌 공간 캐릭터 시퀀스와 일치합니다. 다음 포인터는 Char에 대한 포인터 여야하며, 배열은 모든 시퀀스와 종료 NUL 문자를 받아 들일만큼 충분히 커야합니다. 입력 문자열은 공백 또는 최대 필드 너비에서 멈 춥니 다.

당신은 UB를 호출하고 있습니다. 노력하다:

#define str(x) #x
#define xstr(s) str(x)
#define BUFSIZE 30

char buffer[ BUFSIZE + 1 ];
scanf("%" xstr(BUFSIZE) "s", buf);

그 이상의 것을 무시합니다 BUFSIZE 캐릭터 억제 할당 :

scanf("%" xstr(BUFSIZE) "s%*", buf);

또한 사용자가 반품/Newline을 입력하고 종료했는지 확인해야합니다. scanf 그가 가지고 있다면 :

scanf("%" xstr(BUFSIZE) "[^\n]s%[^\n]*", buf);

그리고 반환 값을 확인하는 것이 좋습니다.

int rc = scanf("%" xstr(BUFSIZE) "[^\n]s%[^\n]*", buf);

마지막으로, 남은 것이 있는지 확인하고 (예 : Newline과 같은) :

if (!feof(stdin))
    getchar();

종료 NUL 문자를 허용하지 않기 때문에 버퍼 오버런이 있습니다. 버퍼를 다음과 같이 선언하십시오.

char buffer[31];

그리고 당신은 괜찮을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top