【问题标题】:Cannot Print Variable Value that Was Incremented in Loop无法打印在循环中增加的变量值
【发布时间】: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)。输出是什么?

标签: c loops scope


【解决方案1】:

很可能您对字符在内存中存储位置的引用被错误编码,这就是您的输出结果如此的原因。确保正确引用其中的文件和文本。除此之外,代码似乎还可以。

我认为这是你应该做的:

int count = 0, c;
FILE *file = fopen("example.txt", "r");

while ((c = getc(file)) != EOF) {
    count++;
    putchar(c);
}

printf("\n%d characters\n", count);
fclose(file);

【讨论】:

  • 我也不清楚你的意思,请你详细说明一下?
  • 我的意思不是目的是从文件中读取。但是,他的代码中没有引用文件,因此获得的结果是内存地址。如果没有进行正确的地址引用,尤其是在使用指针和引用时,这是您会在 C 中发现的典型情况。
【解决方案2】:

尝试在 printf("\n%d characters\n", count);

仅供参考:您的原始代码在 Ubuntu 14.04 Linux 上按预期执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 2014-01-07
    • 2011-03-17
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多