【问题标题】:fprintf prints strange integersfprintf 打印奇怪的整数
【发布时间】:2020-09-14 15:28:50
【问题描述】:

我希望下面的代码生成一个名为 stackexchangeiscool.txt 的文件并写入

Hello!
I changed my mind: 17291729

但事实并非如此。它会生成一个名为 stackexchangeiscool.txt 的文件,其中包含文本

Hello!
I changed my mind: 17293748407

这段代码肯定没有意义;它是我遇到奇怪问题的较大代码的一部分。

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    FILE * file = NULL;
    
    file = fopen("stackexchangeiscool.txt","w");
    
    int n = 1729;   
    
    char myFirstString[] = "This is a string.";
    
    fprintf(file, "Hello!\n");
    
    sprintf(myFirstString, "I changed my mind: %d", n);
    
    fprintf(file, "%s", myFirstString);
    fprintf(file, "%d", n);

    fclose(file);
    
    return(0);
}

编辑:下面的评论表明问题可能来自 myFirstString 太短而无法包含其中包含整数的新字符串。但是,当我删除

fprintf(file, "%d", n);

我明白了

Hello!
I changed my mind: 1729

所以 myFirstString 似乎能够包含字符串和整数。

【问题讨论】:

  • 如果我删除 fprintf(file, "%d", n);它打印你好!我改变了主意:1729 这应该是正确的。

标签: c printf


【解决方案1】:

问题是,myFirstString 只有足够的空间容纳 18 个字符,但您正试图复制大约 23 个字符。这意味着您正在注销数组的末尾。我认为正在发生的事情是n 直接存储在内存中的myFirstString 之后,并且通过注销数组的末尾,您正在“破坏”n

提前确保数组足够大,以便所有内容都可以容纳:

char myFirstString[100] = "This is a string.";

在这里,我将其设置为任意大的100 长度。您可以像这样将其设置为任意固定长度,或者计算您需要的长度并 malloc 它。无论哪种方式,在尝试复制数据之前,您都需要确保有足够的内存可供使用。

【讨论】:

  • @Plop 使用snprintf() 这样您就可以限制长度并确保避免缓冲区溢出(这会导致未定义的行为 (UB))。
猜你喜欢
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 2018-09-29
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 2020-05-25
相关资源
最近更新 更多