Я предполагаю, что вы ожидаете, что любой текст является предложением, но он никогда не будет учитываться вашим кодом, потому что ваш код никогда не попадет в анализ пустого символа, если он никогда не будет частью строки.
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, чтобы вы достигли конца строки, вы автоматически достигнете конца слова и конец предложения.