gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:26:02 24 4
gpt4 key购买 nike

#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

有人可以解释一下发生了什么吗?或者如何解决此类问题?

最佳答案

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

关于c - fprintf 在将其发送到文件时给出意外的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27540793/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com