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

如何使用“.”计算C语言中的句子数,"?", "!"?

葛意远
2023-03-14

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

#include<cs50.h>

#include<ctype.h>

#include<string.h>

#include<math.h>

//function for letter count
int count_letters(string s)
{
    int numberofLetters = 0; // counter

    //loop as long as string length
    for(int i = 0, n = strlen(s); i < n;  i++)
    {
        //if character is alphanumeric
        if(isalnum(s[i]) != 0)
        {
            numberofLetters++; //increase counter
        };
    };
    return numberofLetters; //return new counter number
};

//function for word count
int count_Words(string w)
{
    int numberofWords = 0;//counter for words declared
    int i = 0; // counter for character in string

    if(w == NULL) // if nothing
    {
        return numberofWords; // return Wordcount of 0
    };


    bool spaces = true; //truth value for space

    //if character is not null terminating character
    while(w[i] != '\0')
    {


        if(isblank(w[i]) != 0) //if character is blank
        {
            spaces = true; //its a space
        }
        else if(spaces) //if no more space and a letter is present add to words
        {
            numberofWords++; //add to number of words counter
            spaces = false;
        };
        i++;// increase chracter count in string w

    };

    return numberofWords; //return total word counter
};

//function to count sentences
int count_Sentences(string l)
{
    //variable counter for marks
    int countMarks = 0;

    //loop iteration using the number of characters in string
    for(int i = 0, n = strlen(l); i < n; i++)
    {
        //check if character is ?, . , or !
        if(strcmp(&l[i], "!") == 0  || strcmp(&l[i], ".") == 0  ||  strcmp(l, "?") == 0)
        {
            countMarks++;// sentence counted
        };

    };
    // return the total number of marks
    return countMarks;
};


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

//to check the functions bug checker
    printf("Number of letters: %i\n", count_letters(text));
    printf("Number of words: %i\n", count_Words(text));
    printf("Number of sentences: %i\n", count_Sentences(text));

    //Coleman Liau Index
    int grade = round(0.0588 * (100 * (count_letters(text)) / (count_Words(text))) - 0.296 * (100 *(count_Sentences(text)) / (count_Words(text))) - 15.8 );



    if(grade <= 1)
    {
        printf("Before Grade 1\n");
    }
    else if(grade < 16)
    {
        printf("Grade %i\n", grade);
    }
    else
    {
        printf("Grade 16+\n");
    };
};

共有2个答案

杜正奇
2023-03-14

您确实需要查看一个字符l[i]是否是中的任何一个。.为此,您可以测试它是否等于这些字符常量中的任何一个,即l[i] == '!'||l[i] == '.' || l[i] == '?'

或者可以使用函数strchr,在给定字符串中查找给定字符并返回指向该字符的指针,如果找不到该字符,则返回空指针。空指针在if中被视为falsy,而非空指针则被视为truthy。所以我们可以在字符串中查找l[i]“?”

if (strchr(".?!", l[i])) {
    ...
}

宇文梓
2023-03-14
    if(strcmp(&l[i], "!") == 0  || strcmp(&l[i], ".") == 0  ||  strcmp(l, "?") == 0)

strcmp比较两个字符串。在C语言中,我们的“字符串”本质上是“从指针指向的地方开始,一直持续到空终止符的字符大小的数据”。cs50库不会改变这一点,也不会给你一个真正的字符串类型;它只提供了一个typedef和一些辅助函数来读取输入。(遗憾的是,它也没有,实际上也不能给你一个真正的文本字符类型,而char也没有;但这超出了这个答案的范围。)

无论字符串中有多少标点符号,它都只向句子计数器添加一个。

事实上,它甚至只添加一个,因为您的字符串以其中一个标记结尾。

要比较单个字符,请不要使用strcmp。它既不打算也不适合该目的。char是一个单独的实体,因此可以与=进行比较。你只需要在比较的两边都有合适的东西。

回想一下,在C语言中,单引号用于字符文本,而索引到字符数组(相当于“索引”到字符指针,执行等效指针算法)将为您提供一个字符。因此:

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

  • 我应该使用表达式树来计算后缀表达式。假设我有一棵这样的树 我首先需要计算b子树并将其结果存储在节点中,然后是c*d,依此类推,直到我将结果存储在根节点中。 我尝试了使用堆栈的递归方法,但那不起作用。伪代码是这样的 函数评估(节点) 评估(节点- 然而,这并没有奏效。我还必须在每一步上显示树,以便显示正在减少的节点。我谷歌了很多次,但我找不到所需的答案。任何人请帮助我如何做到这一点。 }

  • 这节课我们来学习下程序中另外一个非常重要的语句:if。 1. 语法 if (判断条件布尔运算) { 条件成立后运行的语句 } 这里的条件判断采用了布尔运算,也就是真值和假值两种情况。当 if 后面放入的条件判断语句的执行最终结果为真的时候,就会执行花括号中的语句,如果条件语句最终的结果为假,那么就不会执行花括号 中的语句,程序会跳过花括号中的代码段,继续执行后面的代码。 这里给出了真值表,以供

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

  • 很多时候 if 语句可以很好的满足我们对于分支控制的需求,但是当你要对于一系列有着相同表达式不同内容的东西分类的时应该怎么办?这正式今天要介绍的内容。 1. 语法 switch (表达式) { case 常量1: 语句1 break; case 常量2: 语句2 break; . . . defa

  • 我想用开放计算给定明文的CBC-MAC。我有以下明文(十六进制转储): 如果我使用openssl的命令行功能,我会得到以下解决方案: 目前为止,一切都好。我有一个额外的块,因为第一个块应该是加密的IV。现在最后一行应该是我的CBC-MAC,如果我理解正确的话。接下来,我试图在C中做同样的事情,下面是示例代码: 之后,我解密加密的消息以验证我的代码。我的代码输出非常令人惊讶: 加密的消息与命令行输出