Окружающая среда: VS2013 Express, Windows 7.
Исходные коды очень просты:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int TestNum, k, idx;
char *strbuf1 = NULL;
strbuf1 = (char *)malloc(sizeof(char) * 10001);
if (strbuf1 == NULL){
printf("memory allocation failed\n");
return -1;
}
gets(strbuf1);
TestNum = atoi(strbuf1);
for (k = 0; k < TestNum; k++){
gets(strbuf1);
printf("k= %d, strbuf1=%s\n", k, strbuf1);
//--- read data ---//
idx = 0;
while (idx < 5){
gets(strbuf1);
idx ++;
}
}
return 0;
}
После создания кода в исполняемый файл, скажем, foo.exe, я протестировал его с помощью "foo.exe <testinput.txt" в окне cmd. Это сломается полностью, но я не могу понять, почему. Кто-нибудь знает?
Я загрузил файл testinput.txt на GDrive, https://docs.google.com/document/d/1d8jBPZfYYjtA9R1CldUZhyRvaAiK5Xk9K-mhE6dIDKU/edit?usp=sharing
Заменить эту строку:
gets(strbuf1);
с:
fgets(strbuf1, 10000, stdin);
Это происходит потому, что fgets
имеет параметр для размера буфера, чтобы избежать переполнения, который gets
не имеет и, следовательно, склонны к переполнению буфера.
10001
(размер strbuf1
)?
testinput.txt
?gets
, так как это очень легко получить переполнение буфера.