Не удается найти точное количество слов в моей строке, начинается с знаков препинания, таких как кавычки

Я пишу код, в котором я должен найти количество слов в строке, зная, что каждое слово может быть разделено любым символом, кроме A-Z (или a-z). Код, который я написал, прекрасно работает, только если в начале предложения нет знаков препинания. Но проблема возникает, когда начинайте предложение с знаков препинания, таких как кавычки (т. Е. «Только соединение» будет отображать в результате 3 слова вместо 2). Я программирую на C ++, используя Dev-C ++. Ваша помощь будет оценена. Мой код ниже:

#include <cstring>
#include <iostream>
#include <conio.h>
#include <ctype.h>

using namespace std;

int getline();   //scope
int all_words(char prose[]);  //scope

int main()
{
getline();
system ("Pause");
return 0;
}int getline()
{
char prose[600];
cout << "Enter a sentence: ";

cin.getline (prose, 600);
all_words(prose);
return 0;
}int all_words(char prose[])
{ int y, i=0, k=0; int count_words=0; char array_words[600], c;

do
{

y=prose[i++];
if (ispunct(y))  //skeep the punctuation
i++;

if ((y<65 && isspace(y)) || (y<65 && ispunct(y)))     //Case where we meet spacial character or punctuation follwed by space

count_words++;   //count words

if (ispunct(y))  //skeep the punctuation
i++;

}while (y); //till we have a character

cout <<endl<<" here is the number of words  "<< count_words <<endl;

return 0;

}***********************************Output******************************
Enter a sentence: "Only connect!"
here is the number of words  3

Press any key to continue . . .

0

Решение

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

  • Цикл пока не конец строки
    • Пропустить все не алфавитные символы (while (!std::isalpha))
    • Пропустить все буквенные символы (while (std::isalpha))
    • Увеличить счетчик слов

Не забудьте проверить конец строки в этих внутренних циклах.

2

Другие решения

Первый

if (ispunct(y))

В первой кавычке вы увеличиваете счетчик i, но переменная y по-прежнему содержит «, что дает второе условие как истинное. Последнее» дает дополнительное приращение к count_words ++;

if ((y<65 && isspace(y)) || (y<65 && ispunct(y)))

В любом случае, ваша задача — просто разбить строку на токены и сосчитать их. Примеры решений можно найти здесь Вот.

0

По вопросам рекламы [email protected]