#include<stdio.h>
#include<conio.h>
int main()
{
char test [7];
for(int i=0;i<10;i++)
scanf("%c",&test[i]);
puts(test);
getch();
return 0;
}
DevC++ (대학교 규칙)를 사용하고 있으며 gets()에 경계 체크가 없으므로 의도적으로 for() 루프를 사용하여 문자열을 입력하는 것으로 알고 있습니다. 배열의 크기보다 큰 문자열을 입력 할 때 puts는 여분의 문자를 인쇄합니다. 왜 그렇게?왜 puts()는 끝에 여분의 문자를 인쇄합니까?
샘플 입력 : helloworld를 출력 : hellowos
샘플 입력 : Hellopeople 출력 : 메모리를 범람하고 있기 때문에 Hellopep
'가져 오기'가 없으므로이 기능이 존재했는지 잊어 버려주세요. OTOH'fgets'는 생존하고 있습니다. 그리고 손으로 쓰는 루프 대신에 그것을 사용해야합니다. NUL 캐릭터로 문자열을 종료하는 것을 주저하지 않았습니다. 또한 최대 10 자의 7 자 긴 버퍼를 의도적으로 오버플로하는 것은 무엇입니까? –
UB multi-dupe입니다. 배열 범위를 오버런하지 말고 SO가 검색 가능하다는 점에 유의하십시오. –
@ n.m. 의도적 인 오버플로는 오버 플로우의 경우 puts의 동작을 확인하는 것이 었습니다. puts()가 단지 8자를 인쇄해야하는 이유를 설명 할 수 있습니까? 7. 인쇄 된 문자가 바로 다음에 나오는 이유는 무엇입니까? –