我正在制作一个购物清单程序,我想包含一个用户输入字符串,将其放在文本文件的下一个可用行中。现在这会将字符串添加到文件中,但随后会在多个空格中放入随机字符,然后,如果我输入其他内容,它将不会在下一行。
void AddToFile(FILE *a) {
char addItem[20];
printf("Enter item: ");
scanf("%s", &addItem);
fwrite(addItem, sizeof(addItem), 1, a);
}
这一行应该是:
// strlen instead of sizeof
fwrite(addItem, strlen(addItem), sizeof(char), a);
您的代码始终写入 20 个字符,而不是字符串的实际字符数。
除了 pivotnig 声明的更正之外,fwrite()
不会将换行符写入文件。在 之后写入新行fwrite()
或将其附加到.addItem
之前的缓冲区fwrite()
。
您应该通过限制复制到的字符数来防止缓冲区溢出buf
:
scanf("%19s", addItem);
在当前示例中,如果您尝试编写超过 20 个字符的项目,您将遇到麻烦,因为 scanf 将覆盖未分配的内存。稍微改进的版本是:
scanf("%19s",&addItem);
这样,至少你不会覆盖随机内存。
编辑:感谢杰克指出 \0 也必须写。