【问题标题】:fprintf gives unexpected output while sending it to file [closed]fprintf 在将其发送到文件时给出了意外的输出[关闭]
【发布时间】:2014-12-18 06:55:14
【问题描述】:
#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 个字符为 '-' 然后是 0 然后是我输入的任何内容(在这种情况下为 test-------------------------------------------------0test

有人可以解释发生了什么吗?或者如何解决这些问题?

【问题讨论】:

  • 与其描述代码的作用,不如发布代码。
  • 当我使用您发布的代码(用分号替换return 0 之后的撇号)时,无论使用printf 还是fprintf,它都会产生完全相同的输出。您的代码可能不是这里的代码吗?或者,您是否在开始之前删除了 account.txt(您的 "a+" 将添加到末尾,也许您之前有奇怪的字符串?)。
  • 您的代码运行良好!
  • 尝试删除您的文件并再次运行您的程序。自从您以附加模式打开文件后,您可能会看到以前运行的输出,

标签: c arrays printf memset


【解决方案1】:
char name[50];
...
int main()
{
    memset(name, '-', 50);
}

C 中的字符串是在内存中连续的字符,后跟一个 NULL 字符 ('\0') 来标记字符串的结尾。打印字符串时,printf 会打印字符串中的每个字符,直到遇到 NULL 字节,然后停止。

在这种情况下,整个字符串以 NULL 字符开始(因为它是一个未初始化的全局字符),然后用“-”覆盖所有字符串。通过这样做,不再有 NULL 终止符来标记字符串的结尾。

我们现在进入了未定义行为的领域。 printf 调用之所以有效,是因为在这种情况下,下一位存储恰好为零,但不能依赖这种行为(再次......未定义的行为)。

要解决这个问题,您需要手动添加空终止符,例如:

char name[50];
int main()
{
    memset(name, '-', 49); // Note we're not writing to the last byte now!
    name[49] = '\0';
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 2016-03-11
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    相关资源
    最近更新 更多