【问题标题】:How do I count words and lines in an input stream?如何计算输入流中的单词和行数?
【发布时间】:2012-09-26 17:20:07
【问题描述】:

我是 C 编程新手,目前正在尝试自学如何创建一个 C 程序,该程序可以计算输入流中的字数和行数,并将两个总数打印到标准输出。

我要做的是让程序计算行数并计算输入流中的单词数。我想让程序包含单词,但不包括空格、制表符、换行符、连字符或冒号。让程序以小数形式输出结果(单词和行)。

#include<stdio.h>

int main()
{
int iochar;
int words;
int lines;

printf("Enter something here:\n\n");

while ((iochar = getchar ()) !=EOF)
    {
    if((iochar == ' ') || (iochar == '\t') || (iochar == '\n'))

    putchar(iochar);
    }

return 0;
}

我想让程序输出它在标准输出中计数的单词和行的值的十进制。这似乎对我不起作用。

【问题讨论】:

  • 我记得已经看过了...
  • 您也没有计数代码。所以它显然不会打印出计数。而且它只打印出空白字符,所以你不会看到它工作。
  • 文件* f = popen("/usr/bin/wc", "w"); while(c = getchar()) fprintf(f, "%c", c);
  • 是的,我之前已经发布过这个,但我被要求重新发布它以更清楚地说明我想要做什么。

标签: c stream counting


【解决方案1】:

当读取值为\n 时,您必须增加lines 的值。要统计字数,可以看这些solutions

你也可以使用wc程序(UNIX)...

【讨论】:

  • 是的,这正是我正在使用的,Unix 系统。
【解决方案2】:

尝试使用switch 语句而不是if,并添加一些计数逻辑:

int wordLen = 0;
while (...) {
    switch(iochar) {
    case '\n':
        lines++; // no "break" here is intentional
    case '\t':
    case ' ':
        words += (wordLen != 0);
        wordLen = 0;
        break;
    default:
        wordLen++;
        break;
    }
}
if (wordLen) words++;

有一个 K&R 章节详细介绍了这个练习,请参阅 1.5.4 字数统计部分

【讨论】:

  • 谢谢你,我会测试一下,如果它有效,请告诉你。再次感谢
【解决方案3】:

您需要阅读标准库函数isspaceispunct;这比对各种字符值进行显式测试要容易(并且考虑了语言环境)。

您需要将 wordslines 初始化为 0,然后在检查输入时更新它们:

if (isspace(iochar) || ispunct(iochar) || iochar == EOF)
{
  if (previous_character_was_not_space_or_punctuation)  // you'll have to figure
  {                                                     // out how to keep track 
    words++;                                            // of that on your own
  }

  if (iochar == '\n')
  {
    lines++;
  }
}

【讨论】:

    【解决方案4】:

    正如 AK4749 所述,您没有任何计数代码。

    同样在 if 语句中,如果字符是空格、制表符或换行符,则仅将字符输出到 stdout。我相信你想要相反的。

    我会尝试以下方法:

    #include "stdio.h"
    
    int main()
    {
        int iochar, words,lines;
        words=0;
        lines=0;
    
    
        printf("Enter something here:\n\n");
    
        while ((iochar = getchar ()) !=EOF)
        {
            if((iochar == ' ') || (iochar=='\t')) 
                words++;
            else if (iochar == '\n')
                lines++;
            else
            {
                putchar(iochar);
            }
        }
        printf("Lines: %d, Words: %d", lines, words);
        return 0;
    }
    

    我没有尝试编译这个,但它应该不会太远。

    希望对你有帮助, 左撇子

    【讨论】:

    • 谢谢,我尝试编译该程序,但它似乎返回了一些错误:
    • 第 10 行:在 int "program.c" 之前或处出现语法错误,第 27 行:警告:函数原型参数必须具有类型 "program.c",第 27 行:警告:旧式声明或不正确的类型:printf“program.c”,第 27 行:警告:标识符重新声明:printf 当前:函数()返回 int 先前:函数(指向 const char 的指针,...)返回 int:“/usr/include/ iso/stdio_iso.h”,第 206 行“program.c”,第 28 行:之前或处的语法错误:返回“program.c”,第 28 行:警告:语法错误:空声明
    • 您好,我已经更新了代码块。我还在更新中添加了以下注释:初始化words 意味着我们不能声明另一个变量(在 C 中,与 C++ 相比,您只能在函数或块的开头声明变量)。新行的测试也不正确(它是反向的)。我已经更新了代码并尝试编译它没有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多