이 buffer overflow?
-
13-12-2019 - |
문제
정말로 혼동하는 경우 내 프로그램은 방식으로 행동 하니다.이제는 그냥 재미까지 예측 프로그램을 쓰고 있어요.
char buffer[20];
char team1_name[20]; // 18 chars + new line + null
char team2_name[20];
printf("Who is team 1?\n");
fgets(buffer, sizeof(buffer), stdin);
strncpy(team1_name, buffer, sizeof(team1_name));
team1_name[strlen(team1_name) - 1] = '\0';
printf("\nWho is team 2?\n");
fgets(buffer, sizeof(buffer), stdin);
strncpy(team2_name, buffer, sizeof(team2_name));
team2_name[strlen(team2_name) - 1] = '\0';
printf("\nEnter %s's info:\n", team1_name);
호기심에 나가 팀 이름을 입력하 20 보다 큰 문자와 그것을 완전히 건너뛰 두 번째 인쇄 문입니다.나는 이에 대하여 보호 buffer overflow?그것은 사용자가에 넣지 뭔가 큰?가 필요 flush 문?
이것은 출력:
Who is team 1?
wjefowiejfwoiejfweoifjweoifjweofijweoifj
Who is team 2?
Enter wjefowiejfwoiejfwe's info:
Wins in last 12:
Losses in last 12:
Points per game:
해결책
첫 번째 fgets (20 개 이상의 문자가 있음)에서 입력이 잘립니다. 두 번째 fgets는 stdin에서 첫 번째 입력 문자열의 끝을 읽을 것입니다.
"team2_name"값을 표시하여 볼 수 있습니다 (Team1_Name에서 20 개의 첫 번째 chars 이후의 문자가 포함되어 있습니다).
죄송합니다, 다음 의견이 잘못되었습니다.그것에 대해 잊어 버리십시오 : 그리고 예, fgets는 sizeof (버퍼) -1을 사용해야합니다.이 인수는 읽기의 최대 수입니다.따라서 sizeof (버퍼) 문자를 읽으면 sizeOf (버퍼) +1 문자 (후행 '\ 0'포함)
을 저장해야합니다.다른 팁
을 읽는 20 자의 stdin 지만,나머지는 입력이 여전히 남아 있습니다.다음 fgets
를 읽고 그 남은 문자,그래서 Team1 라 wjefowiejfwoiejfwe
고 Team2 oifjweofijweoifj
.인쇄 Team2 의 이름을 뿐만 아니라 당신이 볼 것이 사실이다.
제휴하지 않습니다 StackOverflow