fprintf在将其发送到文件时给出意外的输出

时间:2014-12-18 06:55:14

标签: c arrays printf memset

#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

  1. 如果我使用printf将char数组打印到监视器上,我会得到正确的输出test

  2. 如果我使用fprintf并将char数组打印到文件中,输出错误, 比如前49个字符&#39; - &#39;然后是0然后输入的任何内容(在这种情况下为test-------------------------------------------------0test

  3. 有人能解释一下发生了什么吗?或者如何解决这些问题?

1 个答案:

答案 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';
}