【发布时间】:2014-09-02 06:41:45
【问题描述】:
我目前正在尝试学习 C 编程语言,并且正在使用 Kernighan 和 Ritchie 的 The C Programming Language, Second Edition。我正在尝试编写一个类似于他们在第一章中关于文本流的书中给出的示例的程序。
我的程序应该将一个文本文件打印到终端,然后在打印该数字之前计算字符数。这是我的代码:
#include <stdio.h>
int main()
{
int count = 0, c;
while ((c = getchar()) != EOF) {
count++;
putchar(c);
}
printf("\n%d characters\n", count);
return 0;
}
这是输出:
This is a simple file
With two very small lines
I mean three
1 characters
但是当我在count++下面添加这一行时:
printf("%d", count);
结果是:
1T2h3i4s5 6i7s8 9a10 11s12i13m14p15l16e17 18f19i20l21e22
23W24i25t26h27 28t29w30o31 32v33e34r35y36 37s38m39a40l41l42 43l44i45n46e47s48
49I50 51m52e53a54n55 56t57h58r59e60e61
1 characters
这意味着计数正在增加,但我无法从 while 循环之外访问它的值。我认为如果变量的声明(在这种情况下int count = 0在循环之外),那么在循环之后仍然可以达到该值。
如果它有所作为,这就是我所说的:
./example <text.txt
我犯了一个愚蠢的错误吗?任何帮助,将不胜感激。谢谢
更新
我不知道它是否有区别,但我使用的编译器是:powerpc-apple-darwin9-gcc-4.0.1。这就是问题所在?
更新 2
这是我用来编译源代码的命令:gcc -Wall example.c -o example。然而,刚刚发生了一件奇怪的事情。当我运行它时它运行良好:
#include <stdio.h>
int main()
{
int count = 0, c;
while ((c = getchar()) != EOF) {
count++;
putchar(c);
}
printf("x");
printf("\n%d characters\n", count);
return 0;
}
输出是:
This is a simple file
With two very small lines
I mean three
61 characters
此代码与上面代码的唯一区别是printf("x") 行。我不明白为什么如果我打印其他东西它会突然起作用,而且我不明白为什么它不可见。任何字符都可以放在命令中,并且会发生相同的结果。如果添加了多个字符,则打印第二个字符以及之后的任何字符。
【问题讨论】:
-
您的示例文件有 60 个字符,我看不出您的代码有任何问题。确保这是您实际运行的代码。
-
如果您将
printf("%d", count);添加到count++;下面的代码中,您将不会在最后一个字符之后得到61 -
如果文件末尾有空格,很容易找到:在循环前放一条输出语句,输出
'"',循环后也有一条。这样您就可以查看最后一行末尾是否有多余的空格或制表符。 -
输出不包含您工作版本的
x?你能给出输入文件的十六进制转储吗?最后有一些可疑的第 61 字节...... -
获取您的第一个代码 sn-p。将 putchar(c) 替换为 printf("(%d)\n",c)。输出是什么?