Подсчитать все символы в строке, кроме пробелов - PullRequest
1 голос
/ 27 мая 2020

У меня есть пока что в моем C коде, где он считает все в заданной пользователем строке, однако я хочу, чтобы он считал только буквы.

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

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

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

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

int main(void)
{   
    string s = get_string("Text: ");
    int n = 0;

    while (s[n] != '\0')
    {
        if (isalpha(s[n])) //counts letters
        {
            n++;
        }
        else
        {

        }
    }

Я хотел бы попытаться сохранить код похожим, но если это проще, по-другому.

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

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

Если вы внимательно посмотрите на цикл:

while (s[n] != '\0')
{
    if (isalpha(s[n])) //counts letters
    {
        n++;
    }
}

, вы заметите, что, когда s[n] не является альфа, n не увеличивается, поэтому вы застряли в бесконечном l oop.

Счетчик и итератор должны быть разными переменными:

int count = 0;
//...
while (s[n] != '\0')
{
    if (isalpha(s[n])) 
    {
        count++; //counts letters
    }
    n++; //increment iterator
}
1 голос
/ 27 мая 2020

У вас есть бесконечное l oop, как только из-за оператора else встречается небуквенный символ

int n = 0;

while (s[n] != '\0')
{
    if (isalpha(s[n])) //counts letters
    {
        n++;
    }
    else
    {

    }
}

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

В таком случае лучше использовать for l oop вместо while l oop .

Например

size_t n = 0;

for  ( size_t i = 0; s[i] != '\0'; i++ )
{
    if ( isalpha( ( unsigned char )s[i] ) ) //counts letters
    {
        n++;
    }
}

Обратите внимание, что нет смысла объявлять переменную n как имеющую целочисленный тип со знаком int. Лучше объявить его как целочисленный беззнаковый тип size_t. Это тип, который, например, имеет строковая функция strlen.

...