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

C语言中单词、句子和字母的计数程序中的问题

杨乐
2023-03-14

我需要制作一个程序,通过用户的输入来计算单词、句子和字母的数量。在我给出的输入是多行的之前,这个程序工作得很好。如果输入长度超过终端窗口中可容纳的文本长度,程序将开始忽略所有句号/问号/感叹号。我不知道为什么,我需要一些帮助。如果文本可以放在终端窗口的一行中,则不会发生这种情况。我还打印了程序读取的每个字符,但这也忽略了所有的句号/问号/感叹号。这些字符都不会被打印出来。为了澄清,一个句子只是句号/问号/感叹号的数量,单词的数量只是文本中空格的数量加上1。这是我的密码:

#include <stdio.h>
#include <ctype.h> //for the isalpha() function
#include <cs50.h>  //for the get_string() function

int main(void)
{
    int sentences = 0, letters = 0;
    int words = 1;
    char character;
    string text = get_string("Enter Text: \n");

    char x = 0;

    while (text[x] != '\0')
    {
        character = text[x];
        switch (character)
        {
        case ' ':
            words++;
            break;
        case '.':
            sentences++;
            break;
        case '?':
            sentences++;
            break;
        case '!':
            sentences++;
            break;
        default:
            if (isalpha(character))
            {
                letters++;
            }
        }
        x++;
    }

    printf("\n");
    printf("WORDS: %d, LETTERS: %d, SENTENCES: %d\n", words, letters, sentences);
}

我对c相当陌生,但我有大约一年的Python经验。谢谢你抽出时间。

共有1个答案

耿永寿
2023-03-14

我将提出一些建议。

首先,不要使用get_string1(或scanf,或fgets)。对于这样的过滤程序,实际上不需要存储输入来处理它;使用getchar(或fgetc)一次读取一个字符,并在此基础上循环

int c;  // getchar returns int, not char
...
puts( "Enter Text:" );
while ( ( c = getchar() ) != EOF )
{
  // test c instead of text[x]
}

这种方法将处理任何长度的输入(例如,如果您将文件重定向为输入),并且它避免了在注释中发现的潜在溢出问题Weather Vane。缺点是,您必须从控制台手动发出信号EOF以进行交互式输入(根据您的平台使用Ctrl-z或Ctrl-d)。

您可以在开关中折叠一些测试,例如

case '.' :     // Each of these cases "falls through"
case '!' :     // to the following case.
case '?' :
  words++;     // the end of a sentence is also the end of a word
  sentences++;
  break;

您需要添加案例来处理换行符和制表符:

case ' ' :
case '\n' :
case '\t' :
  words++;
  break;

除非您不希望碰撞单词计数器以重复空白字符,或者如果上一个非空白字符是标点符号字符。因此,您需要一个额外的变量来跟踪以前读取的字符的类:

enum {NONE, TEXT, PUNCT, WHITE} class = NONE;
...
while ( ( c = getchar() ) != EOF )
{
  switch( c )
  {
    case ' ' :
    case '\n' :
    case '\t' :
      if ( class == TEXT )
        words++;
      class = WHITE;
      break;
    
    case '.' :
    case '!' :
    case '?' :
      if ( class == TEXT )  // Don’t bump the word counter
        words++;            // if the previous character was
                            // was whitespace or .! ?
      if ( class != PUNCT ) // Don’t bump the sentence counter
        sentences++;        // for repeating punctuation
      
      class = PUNCT;
      break;
      ...
  }
}

仍然会有一些奇怪的情况,这不会给出一个完全准确的计数,但对于大多数输入来说应该足够好了。

你应该能从那里找到剩下的。

  1. CS50字符串处理和I/O例程(如get_string)非常巧妙,但是它们严重歪曲了C实际的工作方式。typedef的string特别令人震惊,因为它的别名不是字符串。请注意,这些工具在CS50课程之外是不可用的,所以不要过于依赖它们。
 类似资料:
  • 我在大学上Java入门课程。我的作业是写一个程序来显示一个句子中1个字母单词的数量,一个句子中2个字母单词的数量...等等。句子是用户输入的。我应该使用一个循环,但不允许使用数组。 然而,现在只是开始,我只是想找出句子第一个单词的字母数。我得到的结果要么是字母数不正确,要么是字符串索引超出范围。 例如,当我输入“这是一个句子”时,它会给我“字符串索引超出范围:4”对此的任何帮助都将不胜感激。

  • 我指的是学习 C 的 K 和 R 书;它是关于在字数统计程序中使用 EOF 的 while 循环,书中给出的程序运行良好,但我想知道它如何在一次输入后停止接受输入并给出带有行、单词、 请帮助我理解这个程序中到底发生了什么来打破循环。 附加代码和输出 -

  • 以下是一个练习的说明,我必须解决cs50 pset2可读性问题(从站点粘贴副本): 你的程序应该计算文本中字母、单词和句子的数量。您可以假设字母是从a到z的任何小写字符或从a到z的任何大写字符,由空格分隔的任何字符序列都应算作一个单词,句号、感叹号或问号的任何出现都表示句子的结尾 这些不是完整的说明,只是我有问题的部分。 我知道如何计算课文中的字母数,但我不知道如何计算单词和句子。我试着用谷歌搜索

  • 对于我的程序,我想颠倒一行文本中的字母。但是我不想颠倒句子中单词的顺序。例如,当我输入:“这是一个字符串” 我得到了一个siht 但我想要的是

  • 我对编码相当陌生。我的“count句子”功能有问题。我将字符串与“.”进行比较,"?" , 和数一句话。无论字符串中有多少标点符号,它都只向句子计数器添加一个。我是否使用strcmp错误地获得了我想要的结果?是否有其他方法可以实现这一点?

  • 这是我上一个问题的后续问题。已经有一个类似的问题(问题)。但我从这个答案中没有得到我想知道的东西。 从上一个问题中,我知道如果我键入很多字符,那么它们将无法用于 getchar(),直到我按 Enter 键。因此,在我按 Enter 键的那一刻,所有字符都将可用于 getchar()。现在考虑以下字符计数程序: 如果我按照以下顺序从命令行输入字符:{1,2,3,^Z,4,5,回车},然后在下一行{