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个字符)的有效文件上。
为什么?
答案 0 :(得分:4)
c中的字符串以空值终止,因此您需要为字符串终止符分配空间。
要适合10个字符的长字,您需要分配11个字节:
char word[11] = { 0 };
答案 1 :(得分:4)
在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
。
答案 2 :(得分:3)
一个10个字符的字符串需要11个字符来表示(最后一个空字节的1个字符)。