Мой код C не правильно подсчитывает слова и предложения, но подсчитывает символы - PullRequest
0 голосов
/ 28 апреля 2020

Я делаю C программу для подсчета количества букв, слов и предложений. Но условие if для подсчета слов и предложений не проверяет наличие нулевого символа. Кто-нибудь может мне помочь: что я делаю не так?

Однако, если условие для подсчета количества символов проверяет наличие нулевого символа.

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

int main (void)
{
    string text = get_string("text: ");
    int p=0,q=0,r,j=0,k=0;
    {
        printf("Your Text is : %s\n", text);
    }
    for(p=0,r=strlen(text); p<r; p++)
    {
        // for counting Letters.
        if (text[p]!= ' ' && text[p]!= '\0' && text[p]!='-' && text[p]!='_' && text[p]!= '.')
        {
            q++;
        }
        // for counting Words.
        else if (text[p]==' ' || text[p]== '-' || text[p]== '\0'  || text[p]=='_')
        {
            j++;
        }
        // for counting Sentences.
        else if (text[p]== '.' || text[p]== '!' || text[p]== '\0')
        {
            k++;
        }
    }
    printf("no.of chars is %i\n",q);
    printf("no.of words is %i\n",j);
    printf("no.of sentences is %i\n",k);
}

включено cs50 Библиотека для получить строку ввода

1 Ответ

0 голосов
/ 28 апреля 2020

Я предполагаю, что вы ожидаете, что любой текст является предложением, но он никогда не будет учитываться вашим кодом, потому что ваш код никогда не попадет в анализ пустого символа, если он никогда не будет частью строки.

C Строки - это не что иное, как массив символов, заканчивающийся нулевым символом ('\ 0'). Этот нулевой символ указывает на конец строки. Строки всегда заключаются в двойные кавычки. Принимая во внимание, что символ заключен в одинарные кавычки в C.

Это означает, что ваша строка оканчивается нулем, то есть все, что ДО конца, является телом строки, но не NULL.

Вы можете просто изменить свой код следующим образом:

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

int main (void)
{
    string text = get_string("text: ");
    int p=0,q=0,r,j=0,k=0;
    {
        printf("Your Text is : %s\n", text);
    }
    for(p=0,r=strlen(text); p<r; p++)
    {
        // for counting Letters.
        if (text[p]!= ' ' && text[p]!='-' && text[p]!='_' && text[p]!= '.')
        {
            q++;
        }
        // for counting Words.
        else if (text[p]==' ' || text[p]== '-' ||  text[p]=='_')
        {
            j++;
        }
        // for counting Sentences.
        else if (text[p]== '.' || text[p]== '!' || text[p]== '\0')
        {
            k++;
        }
    }
        if ( q>0 && text[strlen(text)-1]!='.' && text[strlen(text)-1]!='!')
            { 
              j++;
              k++;
            }
        printf("no.of chars is %i\n",q);
        printf("no.of words is %i\n",j);
        printf("no.of sentences is %i\n",k);

}

Лог c за изменениями следующий:

Вам не нужно проверять нулевое значение, пока вы находятся в теле строки, глядя на один символ. Это потому, что, как я уже говорил, бесполезно. После того, как вы проанализируете всю строку, все, что вам нужно сделать, чтобы убедиться, что был хотя бы один символ (i> 0), а затем, следуя логике c, чтобы вы достигли конца строки, вы автоматически достигнете конца слова и конец предложения.

...