如何计算c中每个字符串的单词和句子的数量?

时间:2020-08-13 12:43:18

标签: c cs50 readability

以下是我必须解决的练习问题,以确保cs50 pset2的可读性(从网站粘贴):

  • 您的程序应计算文本中字母,单词和句子的数量。您可以假定一个字母是从a到z的任何小写字符或从A到Z的任何大写字符,任何用空格分隔的字符序列都应算作一个单词,并且出现任何句点,感叹号或问号指示句子的结尾。

这些不是完整的说明,只是我遇到的麻烦部分。

我想出了如何计算文本中字母的数量,但是却无法弄清单词和句子的数量。我尝试过使用它来搜索并使用其他外部资源,但是弹出的只是问题的答案,坦率地说,这就像在作弊。这是我的代码:

#include<stdio.h>
#include<cs50.h>
#include<string.h>
#include<stdbool.h>
#include<ctype.h>


int main (void)
{
    int letters = 0;
    string text = get_string("Text: ");
    int words = 0;

    for (int i = 0; i < strlen(text);i++)
    {
        if(isalpha(text[i]) != 0)
        {
        letters++;
        }
    }
    printf("Letters: %i\n", letters);
    


   for (int i = 0; i < strlen(text);i++)
   {
       if (isspace(text[i]) != 0)
       {
          if(isalpha (text[i] + 1) != 0) 
          {
              words++;
          }
       }
 
   }
   
   printf("Words: %i\n", words);
}

此代码计算正确的字母数,但始终键入Words:0。我还没有完成句子部分。我可以帮忙吗?如果您给我答案,您能否解释为什么会这样?

1 个答案:

答案 0 :(得分:2)

for (int i = 0; i < strlen(text);i++)
{
    if (isspace(text[i]) != 0)
    {
       if(isalpha (text[i] + 1) != 0) 
       {
           words++;
       }
    }
}

这里有些错误。您需要做的是意识到该程序可以处于两种状态之一。您当前是否正在阅读单词。

bool reading_word = false; // Flag
int words = 0;

for(int i=0; i<strlen(text); i++) {
    if(isspace(text[i]) {
        reading_word = false;
    }
    else if(isalpha(text[i])) {
        if(!reading_word) {
            reading_word = true;
            words++;
        }
    }
}

此外,请不要写if(isspace(text[i]) != 0)。它返回一个布尔值,因此基本上可以读取“如果text [i]是空格”,那么只需写if(isspace(text[i]))

此外,在您的代码isalpha (text[i] + 1)中是完全错误的,没有任何意义。既然这是家庭作业,我就留给你找出原因。

对于句子,您可以使用如下函数:

int isdelim(char c)
{
    return c == '.' || c == '!' || c == '?';
}

,然后以与计数单词的循环类似的方式使用它。