c - c中的fprintf输出错误

标签 c file pointers fopen printf

所以这是我试图开始工作的代码:

char* inFile = "input.txt";
FILE *out = fopen("output.txt", "a+");
int i = 0
while(i < 5){
            int countFound = findWord(inFile, keyWord[i]);//returns count of keywords in given file
            fprintf(out, "%s: %d\n", keyWord[i], countFound);
            i++;
        }
fclose(out);

这段代码的输出是:

youshouldsee1
: 3
youshouldsee2
: 3
youshouldsee3
: 3
youshouldsee4
: 3
youshouldsee5: 1

预期输出:

youshouldsee1: 3
youshouldsee2: 3
youshouldsee3: 3
youshouldsee4: 3
youshouldsee5: 1

我真的不明白为什么输出是这样的,它不应该打印字符串和 int 然后换行吗?另请注意,最后一行之后没有换行符,但应该有。我做了一些测试,我注意到如果我将 fprintf 语句更改为 fprintf(out, "%s\n", keyWord[i]); 输出为:

youshouldsee1
youshouldsee2
youshouldsee3
youshouldsee4
youshouldsee5

其格式要好得多。再次注意,最后一行之后没有换行符,但应该有。 我注意到,在仅使用 printf 语句执行此操作时,我遇到了完全相同的问题,但输出稍微困惑一些。

有人知道是什么原因导致这个特定问题吗?非常感谢。

数组 keyWord[] 是一个双指针,我不确定这是否有区别,但我想我会提到它。它的声明方式如下:char** keyWord;。它的创建如下:

char *tempWord = "something";
keyWords[x] = strdup(tempWord);

这可能完全无关紧要,但我认为最好提及它。

最佳答案

您的 中可能有一些回车符('\r' 或 0x0D)和/或退格字符('\b' 或 0x08) keyWord[i] 字符串。

CR 和退格键通常不会打印到终端,而是移动终端光标 — CR 会将光标移动到当前行的开头,而退格键会将光标向后移动一个字符。当打印后续字符时,它们会覆盖之前的字符。所以这段代码

printf("foobar\rbaz\n");

此输出的结果

bazbar

和这段代码

printf("foo\bbar\n");

此输出的结果

fobar

如果您查看输出的原始字节而不将其打印到终端,您应该会看到简单的 CR 和退格键。我喜欢使用该程序hexdump(1)要做到这一点。例如:

$ echo -e 'foobar\rbaz'
bazbar
$ echo -e 'foobar\rbaz' | hexdump -C
00000000  66 6f 6f 62 61 72 0d 62  61 7a 0a                 |foobar.baz.|
0000000b

因此,我建议查看程序输出中的原始数据,找出讨厌的字符在哪里,然后找出如何删除它们。

关于c - c中的fprintf输出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20291677/

相关文章:

c - 如何使用结构体中包含的枚举作为函数的参数?

c - 按特定顺序对 argv 进行排序

c++ - 如何定义指向 sqlite3 结构的静态指针? C++

c - 对于定义为 0 的宏,#ifdef 和 #if 之间的细微差别

c - malloc 和 realloc 数组给出意外输出

c - 文件读取问题 - 平行版生命游戏

javascript - 使用 Node.js 直接磁盘访问

C:如何修改结构中字符串的最大大小?

c - 是什么导致 pthread 失效?

c# - File.Move原子操作