当前位置: 首页 > 知识库问答 >
问题:

我如何计算一段中的字数?我一直算错

笪德华
2023-03-14

我试图编写一个程序,计算文本中字母、单词和句子的数量。我可以假设一个字母是从a到z的任何小写字符或从a到z的任何大写字符,任何由空格分隔的字符序列都应算作一个单词,任何句点、感叹号或问号的出现都表示一个句子的结束。

到目前为止,我可以正确地计算字母和句子的数量,但是我错过了单词的数量:

例如是!

输出应为:3个字母1个单词1个句子

我得到的是:3个字母0个单词1个句子

更新:在printf函数前面的末尾键入另一个(单词)后,它现在可以正常工作。谢谢大家的帮助:)。

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

int main(void)
{
    string text = get_string("Enter text: ");
    printf("Output:\n");
    int lettercount;
    int words = 0;
    int sentences = 0;
    int letters = 0;
    int length = strlen(text);
    for(lettercount = 0; lettercount < length; lettercount++)
    {
        if(isalpha(text[lettercount]))
        {
            letters++;
        }
        else if(text[lettercount] == ' ' || text[lettercount] == '\t' || text[lettercount] == '\n' || text[lettercount] == '\0')
        {
            words++;
        }
        else if(text[lettercount] == '.' || text[lettercount] == '!' || text[lettercount] == '?')
        {
            sentences++;
        }
    }
    words++;
    printf("%i letter(s)\n", letters);
    printf("%i word(s)\n", words);
    printf("%i sentence(s)\n", sentences);
}

共有2个答案

舒博雅
2023-03-14

你总是有单词-1,因为你只在空格或新行后向计数器添加新词,但是最后一个单词呢!?总是最后一个单词将不被计算,所以在计算任何段落后,添加1到您的单词计数器。例句:是的!--

芮叶秋
2023-03-14

代码的主要问题是,如果输入文本中的“final”字后面没有空格,则它不会对其进行计数(终止的'\0'字符将不会是测试字符串的一部分,因为strlen函数不包括该字符。

此外,如果您的单词被多个空格分隔,您将遇到问题;为了解决这个问题,您可以使用inWord标志来跟踪当前字符是否已经在单词中,如果没有,则设置每当我们找到一封信时,就标记。

此外,如果你有“…”之类的东西,你的句子数也会有问题 在您的输入中;在你的句子后面注释掉的行 行将修复该问题(如果您愿意)。

最后,为了准确起见,你不应该假设字母“a”到“z”和“A”到“Z”将是一个连续的序列。它们可能是(现在大多数系统使用ASCII编码),但是您应该使用isalpha函数以获得更多的可移植性(以及isspace函数)。

int main(void)
{
    string text = get_string("Enter text: ");
    printf("Output:\n");
    int lettercount;
    int words = 0;
    int sentences = 0;
    int letters = 0;
    int inWord = 0;// Set to 1 if we are inside a (new) word!
    int length = (int)(strlen(text)); // Don't evaluate length on each loop!
    for (lettercount = 0; lettercount < length; lettercount++) {
        int testChar = text[lettercount]; // Get a local copy of the current character
        if (isalpha(testChar)) { // Don't assume that 'a' ... 'z' and 'A' ... 'Z' are in contiguous sequences
            letters++;
            if (!inWord) words++; // Any letter means that we're in a (possibly new) word...
            inWord = 1;           // ... but now set this 'flag' so as not to count others!
        }
        else if (testChar == '.' || testChar == '!' || testChar == '?') {
            sentences++;
        //  if (inWord) sentences++; // Check that we're in a word, or stuff like "..." will be wrong
            inWord = 0; // Now we are no longer inside our current word
        }
        else if (isspace(testChar)) { // We could also just assume ANY other character is a non-word
            inWord = 0; // Now we are no longer inside our current word
        }
    }
    printf("%i letter(s)\n", letters);
    printf("%i word(s)\n", words);
    printf("%i sentence(s)\n", sentences);
    return 0;
}

请随时要求任何进一步的澄清和/或解释。

 类似资料:
  • 你能帮我在这段代码中添加一个额外的检查吗?这个检查可以帮助我找出每一段的字数? BufferedReader br=新的BufferedReader(新的InputStreamReader(新的FileInputStream(path))); }爪哇

  • 问题内容: 我如何定义一个具有两个计算字段的视图,例如… …并根据前两个计算字段创建第三个计算字段,如… …? 当我按名称引用前两个计算字段时,我收到一条消息,指出字段未知。 谢谢! 问题答案: 由于视图中不允许子查询,因此您需要通过创建多个视图来模拟它们。 例如,如果直接执行此查询,将解决您的问题: 根据MySQL文档,视图在FROM子句中具有不能包含子查询的限制。要变通解决此限制并将该查询转换

  • 我无法激活计数器++。到目前为止,s2能够读取s1,但不能计数出现的次数。如有任何帮助,我们将不胜感激。(我意识到我在错误的字符串中工作,但它帮助我首先在这里创建解决方案,然后将其发送到第二个字符串,这是不是很糟糕的逻辑?) 很抱歉问了这个愚蠢的问题,我对编程很陌生 //我需要一个扫描器来读取我所写内容,该扫描器应该计算一个字符的出现次数另一个扫描器声明的扫描器a会询问“write Somethi

  • 问题内容: 任何人都知道如何计算这些列之一的平均值(在Linux上)? 例如:mean(第2栏) 问题答案: Awk: 读为: 对于每一行,将第2列添加到变量“总计”中。 在文件末尾,打印“总计”除以记录数。

  • 在Ruby on Rails中,有一个特性允许您使用任何日期并打印出它是多么“久远”。 例如: 在Java有什么简单的方法可以做到这一点吗?

  • 在 SQL 函数中计算字段 你可以把字符串表达式变量用于SQL 合计函数以在字段中进行值的计算。例如,可以将一个字段的值乘一系数来计算百分比 (如附加税或销售税)。 下列表提供了对 Northwind.mdb 数据库的 Orders (订单)及 Order Details (订货明细)表中字段进行计算的示例。 计算 示例 往字段中加一个数 Freight +5 从字段中减一个数 Freight -