Как посчитать цифры и символы строки? - PullRequest
0 голосов
/ 14 июня 2019

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

В нем говорится, что мне нужно написать программу для анализа строки.И для этого нужно указать количество слов и цифр.

Обратите внимание, что число - это тоже слово.123 - это слово и число, но, например, 4HIMATE - это не число, а только слово.

Я дам свой код того, что я получил до сих пор

int main()

{
int size= 256;

char s[256]= "Hi 123 Peter 8hi hi8";
char space[]= " ";


int wordCount= 0;
int numberCount= 0;

strcat(s, space);

strlwr(s);

for(int i= 0; s[i]!='\0'; i++)
{
    if(s[i+1]== ' ' && s[i]>96 && s[i]<123)
    {
        wordCount++;
    }

    if(s[i+1]== ' ' && s[i]>47 && s[i]<58)
    {
        wordCount++;
    }

}

for (int j=0; j<size; j++)
{

    if(s[j+1]== ' ' && s[j]>47 && s[j]<58)
    {
        numberCount++;
    }
}

printf("Words= %d\n", wordCount);
printf("Numbers= %d", numberCount);

return 0;
}

Мой выводдолжно быть =

Words = 5 Numbers = 1

Но ошибка в числах, результат равен 2.

Я действительно не знаю, как это решить, поэтому мне нужна помощь.

Исправлено несколько ошибок (правка):

 for(int i= 0; s[i]!='\0'; i++)
{
    if(s[i+1]== ' ' && s[i]>'a' && s[i]<'z')
    {
        wordCount++;
    }

    if(s[i+1]== ' ' && s[i]>'0' && s[i]<'9')
    {
        wordCount++;
    }

}

for (int j=0; s[j]!='\0'; j++)
{

    if(s[j+1]== ' ' && s[j]>'0' && s[j]<'9')
    {
        numberCount++;
    }
}

1 Ответ

1 голос
/ 14 июня 2019

Ваша логика несовершенна, так как вы не будете считать последнее «слово» (hi8) словом. Точно так же вы не будете считать «числа», если они являются последними в строке. Это можно выяснить с помощью некоторой отладки .

Одним из возможных решений является использование состояний . Одно состояние, которое сообщает, если вы в слове или нет, и другое состояние, которое сообщает, все ли текущее слово состоит из цифр или нет.

Используя состояния, при зацикливании строки вы проверяете, является ли текущий символ буквенно-цифровым символом . Если это так, и состояние «is-a-word» не установлено, установите это состояние. При изменении состояния также проверьте, является ли текущий символ цифрой и, если он задан, задайте состояние числа. Продолжая цикл, если установлено состояние is-a-word и текущий символ , а не цифра, вы очищаете состояние is-number. Достигнув того, что является пробелом , вы проверяете свои состояния: если задано is-a-word, очистите его и увеличьте счетчик слов; Если установлено состояние is-number, увеличьте счетчик чисел и очистите состояние.

В псевдо коде это может быть что-то вроде этого:

is-a-word-state = false
is-a-number-state = false

for each character in string
{
    if (current-character is alphanumeric and is-a-word-state == false)
    {
        // Started a new word
        is-a-word-state = true

        if (current-character is digit)
        {
            // Could be a number
            is-a-number-state = true
        }
    }

    if (current-character is not digit)
    {
        // Current word (if any) is not a number
        is-a-number-state = false
    }

    if (current-character is space)
    {
        if (is-a-word-state == true)
        {
            // End of the current word
            word-counter++

            if (is-a-number-state == true)
            {
                // Word is a number
                number-counter++
            }
        }

        is-a-word-state = false
        is-a-number-state = false
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...