如何使用getchar运行程序?

问题描述:

我是一个总C n00b试图教自己C关K &河我的问题是一种尴尬的初级。好的,这里是:我无法使用getchar获得程序来提供我期望的输出。如果您碰巧碰到了K &,我会被困在练习1.13中。问题是,“编写一个程序来打印输入中单词长度的直方图”,由于我遇到了这个问题,我甚至无法处理横向版本。如何使用getchar运行程序?

我在XP上使用Dev-C++(mingW编译器)并在命令行下运行程序。我的问题是,当我尝试运行我的程序时,它会等待我输入要扫描的字符,但是当我完成输入并按Enter时,它不会执行任何操作。我希望它能够按照我的预期打印直方图。实际上,它似乎不计算字长,因为正如代码中所见,当我尝试打印ctr数组中的内容以查看它是否包含任何内容时,什么都不打印。

我是如此的n00b,我不知道它是我的代码还是错误的命令行。但我怀疑这是系统的问题,因为当我尝试编译并运行a model program时,会发生同样的情况。输入输入,按回车,没有任何反应。如果我按Ctrl-C,有时它会吐出一个或两个看起来不像模型输出的星号。其他时候,它不会做任何事情(只是回到提示)。

这是我的练习代码。我花了整整一天的时间,质疑我继续进行编程的能力。我真的很感激,如果有人能让我摆脱这个漏洞!

另外,我还有一个关于我上面提到的模型程序的问题,但我想我应该在它自己的问题中发布它。谢谢所有:)

#include <stdio.h> 

//#define 1 IN 
//#define 0 OUT 
int main() { 
    //start w/ state = OUT 
    int c = 0; 
// int state = OUT; 
    int len = 0; 
    int ctr[12]; 
    int i, j; 
    i = j = 0; 

    for (i = 0; i <12; i++) 
     ctr[i] = 0; 
    while ((c = getchar()) != EOF) 
     if (c != ' ' && c != '\t' && c != '\n') { 
//   state = IN; 
      len++; 
      printf("%d", len); 
      } 
     else { 
      ctr[len]++; 
      len = 0; 
      }    
    for (i = 0; i <12; i++) 
     printf("%d\n", ctr[i]); 
    for (i = 0; i <12; i++) { 
     printf("%d\n", i); 
     for (j = 0; j <= ctr[i]; j++) 
      printf("-"); 
     printf("\n"); 
     } 
    return 0; 
} 
+1

与你的问题没有关系,但考虑抛弃DevC++。它是越野车,不再被开发。一个很好的FOSS替代方案是http://www.codeblocks.org上的Code :: Blocks。但正如我所说的,这与您的问题无关 - 切换IDE不会解决问题。 – 2010-01-04 22:22:27

+0

我有CB一段时间。你不会相信,但是有一段时间我只是不知道如何使用它特别是调试功能:在点击某个错误的按钮后,它停止向我显示我的代码中的错误列表。经过几天的文档挖掘,我放弃了,回到了唯一一个我知道我的方式的IDE:D – 2010-01-04 22:33:25

+0

Anita,很抱歉听到这个消息。你有没有在http://forums.codeblocks.org上询问你的问题。或者你甚至可以尝试在SO上发布一个问题。坦率地说,任何事情都必须比DevC++更好。 – 2010-01-04 23:29:57

您的while循环正在寻找代表文件结束而不是行尾的EOF。

在Windows上,您需要键入ctrl-z来模拟文件结束。

+0

啊!而已!这些书没有告诉我这一点。我想知道如果你不来,我最终会学习这个“有趣的事实”。非常感谢! – 2010-01-04 22:04:00

+1

如果您需要与K&R预期相同的行为,您将受益于在virtualbox中运行Linux:D – 2010-01-04 22:11:25

+0

感谢您的建议!我只是看着virtualbox。我在这里遇到信息过载的轻度情况。该死的学习曲线。 – 2010-01-04 22:40:17

它看起来并不像你实际存储c(你的输入)在任何地方......也不打印它。您正在打印字符串的大小,但不是实际的字符。如果你ctr [i] = c;某处(即将字符添加到数组中),然后打印该数组,您将看到您的输入。哦,是的,关于CTRL-Z的答案也很重要。 此外,如果您完全不熟悉该语言,我强烈建议您在内容的周围放上括号。在浏览代码并知道什么会属于while循环的范围之前还有一段时间,如果没有大括号的话,什么都不会。

+0

恐怕我不太明白你的意思 - 可能是一个释义吧?谢谢! 如果你正在讨论通过数组循环并打印其内容的部分,那么是的,它实际上是我感兴趣的每个单词中的字符数,而不是单词本身(练习是打印字长的直方图)。 – 2010-01-04 22:08:09

+1

啊......我明白了。好了,那么从我的文章中唯一要拿掉的就是括号里的东西。而(1){stuff stuff here} ;.在你的例子中,你有一个if/else,跟在没有括号的地方。老学校C不允许这样做,但知道C++的现代编译器不介意。我只是说你应该使用大括号,即使它们不是强制性的,至少在你开始认识这门语言的时候,因为你会遇到像while(1){do stuff;做更多的东西;} vs. while(1)做足;做更多的东西;。它看起来很相似,但是非常不同。 – 2010-01-04 22:34:59

+0

非常真实。事实上,我昨天花了一个小时追踪了一个其他的条件,这条条条条条大路(它开始时只有一条语句,但后来没有添加括号就扩展了)。将从现在开始 - 谢谢:) – 2010-01-04 22:52:57

我没有看到代码的任何错误,所以我在gcc下加载它,它似乎工作正常,只要你记得你必须放入一个EOF(CTRL-D)来终止while循环。我输入了4行,虽然我无法对答案的正确性作任何说明,但每次按Enter时,我都会得到一系列与我输入的字符数相等的数字,然后是一个空格。这正是你的代码所要做的。

当我进入CTRL-D时,我得到了摘要信息。再次,我不会对输出的正确性做任何表述,但我确实得到了代码中描述的两个主要部分。

+0

它确实打印了各种直方图(带破折号)?那太棒了。我现在没有办法测试我的程序。 另外,我认为你在Ubuntu上?因为Windows中的EOF模拟显然是Ctrl-Z。 – 2010-01-04 22:38:53

+0

是的,它打印了某种直方图。就像我说的,我甚至没有尝试验证输出。我的环境实际上是在Windows 7下的Cygwin。安装开发工具包,你有gcc,gdb等。你甚至可以启动X服务器并执行GUI。 – jfawcett 2010-01-04 23:35:58