문제
버퍼가 있고 버퍼가 보유 할 수있는 것보다 더 많은 문자를 입력하는 것을 원하지 않습니다 (버퍼 오버런을 피하기 위해).
나는 사용 중입니다 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];
그리고 당신은 괜찮을 것입니다.