#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char name[50];
int main()
{
FILE *fp;
fp = fopen("./account.txt","a+");
memset(name,'-',50);
scanf("%s",name);
printf("%s",name); // i get correctoutput
fprintf(fp,"%s",name); // I get wrong output
return 0;
}
在我的代码中我有
- 全球宣言
char name[50];
主要使用
memset(name,'-',49);
并使用scanf
将值读入字符串。我得到两个不同的输出
//假设我将输入设为test
如果我使用printf
将char数组打印到监视器上,我会得到正确的输出test
如果我使用fprintf
并将char数组打印到文件中,输出错误,
比如前49个字符&#39; - &#39;然后是0
然后输入的任何内容(在这种情况下为test
)
-------------------------------------------------0test
有人能解释一下发生了什么吗?或者如何解决这些问题?
答案 0 :(得分:1)
char name[50];
...
int main()
{
memset(name, '-', 50);
}
C中的字符串是在内存中连续的字符,后跟一个NULL字符(&#39; \ 0&#39;)来标记字符串的结尾。打印字符串时,printf
将打印字符串中的每个字符,直到遇到NULL字节,然后停止。
在这种情况下,整个字符串以NULL字符开头(因为它是一个未初始化的全局字符),然后用&#39; - &#39;覆盖所有字符串。通过这样做,不再有NULL终止符来标记字符串的结尾。
我们现在进入了未定义行为的土地。 printf
调用工作正常,因为在这种情况下,下一位存储是零,但不能依赖这种行为(再次......未定义的行为)。
要解决此问题,您需要手动添加空终止符,例如:
char name[50];
int main()
{
memset(name, '-', 49); // Note we're not writing to the last byte now!
name[49] = '\0';
}