为什么堆栈被破坏了?
int compare_chars(const void* a, const void* b) { char* c1 = (char*)a; char* c2 = (char*)b; return *c1 - *c2; } int main(int argc, char* argv) { FILE* file = fopen("c:\\file.txt", "r"); assert(file != NULL); char word[10] = { 0 }; while (!feof(file)) { fscanf(file, "%s", &word); qsort(word, 10, sizeof(char), &compare_chars); for (int i = 0; i < 10; i++) printf("%c", word[i]); printf("\n"); } fclose(file); }
我收到以下消息:
运行时检查失败#2 – 变量’word’周围的堆栈已损坏。
它发生在仅包含“0123456789”(10个字符)的有效文件中。
为什么?
在fscanf
声明中 –
fscanf(file, "%s", &word); ^not needed (remove &)
char word[10] = { 0 };
字符串以null terminated
。 因此,增加数组word
大小以包括'\0'
。
while (!feof(file))
是错误的。
编辑
相反,你可以用fscanf
控制循环 –
while(fscanf(file, "%s", word)==1){ // your code }
因为成功完成后,
fscanf
将返回成功匹配和分配的输入项的数量。
在您的情况下, fscanf
将在成功时返回1
。
c中的字符串以空值终止,因此您需要为字符串终止符分配空间。
要适合10个字符长的单词,您需要分配11个字节:
char word[11] = { 0 };
一个10个字符的字符串需要11个字符来表示(最后一个空字节的1个字符)。