c中输出错误的fprintf

时间:2013-11-29 18:38:21

标签: 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);

这可能是完全无关紧要的,但我认为最好提一下。

1 个答案:

答案 0 :(得分:0)

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

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

所以我建议查看程序输出中的原始数据,找出讨厌字符的位置,然后弄清楚如何摆脱它们。