【问题标题】:if there are two spaces, it will count it as 3 words如果有两个空格,则将其计为 3 个单词
【发布时间】:2018-05-29 01:15:10
【问题描述】:
#include <stdio.h>
#include <ctype.h>

int main (){

  int ch;
  unsigned long int charcount=0;
  unsigned long int wordcount=0;
  unsigned long int linecount=0;

  while((ch=getchar())!=EOF){
    if (ch!=' '&& ch!='\n'){ 
      charcount++;
    } 
    if(ch==' '|| ch=='\n'){
      wordcount++;
    }
    if (ch=='\n'){
      linecount++;
    }
  }

printf( "%lu %lu %lu\n", charcount, wordcount, linecount );
return 0;
}

问题是:一个调用的 C 程序计算从标准输入读取的字符、单词和行数,直到达到 EOF。 单词被定义为连续的字母序列(a 到 z,A 到 Z)和撇号(',十进制值 39),由这些范围之外的任何字符分隔。 行定义为由换行符 ('\n') 分隔的连续字符序列。 超出最后一个换行符的字符将不计入行数。

在大多数情况下,它会正确计算字数,但我认为我的字数条件不正确

【问题讨论】:

  • 您的代码没有按照您在文本中所说的进行。例如,像这样的序列 将被计为 3 个单词,而实际上它是 0 个单词。 ( 不是字符,但 <..> 是字符)。你需要寻找 a-z, A-Z ' 的东西来开始一个词。你没有这样做。
  • 有一些 libc 函数可以帮助您完成任务,它们位于 ctype.h 您可能想查看:isalpha isspace 等。
  • 空格和换行符在“什么是字符”的正常规则下都是可数字符。您通常需要跟踪您是否在一个词中,并发现您何时从“在一个词中”转换为“不在一个词中”,反之亦然。你需要“一言以蔽之”开始。将 'a1b2c3d' 计为 4 个单词有点不寻常,但你的规则说这就是应该发生的事情——你的代码没有注意到这种可能性。

标签: c


【解决方案1】:

您的程序未正确处理单词分隔符。相反,它包含任何单词分隔符都标记单词结尾的假设。因此,即使没有单词开始,它也会计算一个单词。

有很多方法可以解决这个问题,但一般的想法是保持某种状态,表示你要么在一个词中,要么你在词之间。

这是一个这样的例子:

int wordcount = 0;
int betweenwords = 1;
while((ch=getchar())!=EOF)
{
    if (!isspace(ch)) {
        wordcount += betweenwords;
        betweenwords = 0;
    }
    else {
        betweenwords = 1;
    }
}

这不遵循与您的程序相同的单词标准(我的程序将所有非空格字符视为单词),但适应起来非常简单。这里的重点是了解您可以使用某种状态变量来确定是否增加您的字数。在我的示例中,状态变量也用作增量。

【讨论】:

    猜你喜欢
    • 2021-09-09
    • 1970-01-01
    • 2018-10-29
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多