Подсчет всей строки, включая пробелы в C - PullRequest
0 голосов
/ 11 января 2019

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

Я попробовал этот тип кода, но он просто считает первое слово и затем показывает количество букв в этом первом слове.

Пока что это то, что я пробовал.

int main(){
    char get[100];
    int i, space=0, len=0, tot;
    scanf("%s", get);

    for (i=0; get[i]!='\0'; i++)
    {
        if (get[i] == ' ')
            space++;
        else 
            len++;
    }

tot = space + len;
printf("%i", tot);
}

И

int main(){
    char get[100];
    int len;
    scanf("%s", &get);
    len = strlen(get);
    printf("%i", len);
}

Но все равно получил бы тот же ответ, что и первый.

Я ожидал, что если вход: лиса великолепна. выход: 19

Но все, что я получаю, это вход: лиса великолепна. выход: 3

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Ответ от Arkku правильный в своем диагнозе. Однако, если вы хотите использовать scanf, вы можете сделать это:

scanf("%99[^\n]", get);

99 указывает scanf не читать больше 99 символов, поэтому ваш буфер get не будет переполнен. [^\n] говорит scanf читать любой символ, пока он не встретит символ новой строки (когда вы нажмете ввод).

Как указал Чукс, в коде по-прежнему есть 2 проблемы.

При использовании scanf всегда полезно проверить его возвращаемое значение, то есть количество элементов, которые он мог прочитать. Кроме того, действительно \n остается во входном буфере при использовании вышеуказанного синтаксиса. Итак, вы можете сделать это:

if(scanf("%99[^\n]", get) == 0){
    get[0] = 0; //Put in a NUL terminator if scanf read nothing
}

getchar();      //Remove the newline character from the input buffer
0 голосов
/ 11 января 2019

strlen уже включает пробелы, так как она считает длину строки до завершающего символа NUL (ноль, '\0').

Ваша проблема в том, что %s преобразование scanf прекращает чтение, когда встречает пробел, поэтому ваша строка никогда не включала его в первую очередь (это можно легко проверить, распечатав строку). (Вы можете исправить это, используя различные преобразования scanf, но в целом проще сделать все правильно, прочитав fgets - это также заставляет вас указывать размер буфера, исправляя потенциальное переполнение буфера в вашем текущем коде.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...