Почему это до сих пор считает пробелы в строке? - PullRequest
1 голос
/ 09 июля 2020

Я только начинаю писать код, и мне нужна помощь в выяснении, почему этот l oop считает пробелы в строке.

Насколько я понимаю, этот код должен сказать компьютеру, чтобы он не считал пробелы " / 0 "и увеличьте счетчик, если l oop проходит через строку и это любой другой символ.

int main(void)
{

    string t = get_string("Copy & Past Text\n");
    int lettercount = 0;

   for (int i = 0; t[i] != '\0'; i++)
    {
          lettercount++;
        
    }

    printf("%i", lettercount);

    printf("/n");
}

Ответы [ 5 ]

3 голосов
/ 09 июля 2020

\0 представляет собой нулевой символ, а не пробел. Он находится в конце строк, чтобы указать на их конец. Чтобы проверять только наличие пробелов, добавьте условный оператор внутри l oop.

int main(void)
{
    string t = get_string("Copy & Past Text\n");
    int lettercount = 0;

    for (int i = 0; t[i] != '\0'; i++)
    {
        if (t[i] != ' ')
            lettercount++;
    }

    printf("%i", lettercount);

    printf("\n");
}
1 голос
/ 09 июля 2020

Это для l oop

for (int i = 0; t[i] != '\0'; i++)

повторяется до тех пор, пока текущий символ не станет завершающим нулевым символом '\0', который является нулевым символом. Таким образом, символ не считается.

В C в заголовке <ctype.h> объявлена ​​стандартная функция isalpha, которая определяет, представляет ли символ букву.

Обратите внимание на что пользователь может, например, вводить символы пунктуации в строку. Или он может использовать символ табуляции '\t' вместо символа пробела ' '. Например, его ввод может выглядеть как "~!@#$%^&" без какой-либо буквы.

Так что правильнее было бы написать l oop следующим образом

size_t lettercount = 0;

for ( string s = t; *s; ++s )
{
    if ( isalpha( ( unsigned char )*s ) ) ++lettercount;
}

printf("%zu\n", lettercount );

Это выражение

printf("/n");

удаляется. Я думаю, вместо этого вы имеете в виду

printf("\n");

, то есть вы хотите вывести новый символ строки '\ n'. Но этот символ можно вставить в предыдущий вызов printf, как я показал выше

printf("%zu\n", lettercount );
1 голос
/ 09 июля 2020

Вы неправильно понимаете природу C строк.

Строка - это массив символов с низким значением ('\ 0'), обозначающим конец строки. Внутри строки некоторые символы могут быть пробелами ('' или x20).

Таким образом, условие «t ​​[i]! = '\ 0'» отмечает конец l oop.

Простое изменение:

if ( t[i] != ' ') {
    lettercount++;
}

Заставит вашу программу работать.

1 голос
/ 09 июля 2020

Пробел считается символом, ваш код проходит через строку (массив символов) и считает символы, пока не достигнет символа завершения строки, который равен '\ 0'.

Изменить: установить if в l oop if (t [i]! = ''), и вы больше не будете считать пробелы.

0 голосов
/ 09 июля 2020

Нулевой конец - это последний ведущий элемент в массиве символов, состоящем из строкового литерала (например, Hello there!\0). Он завершает al oop и предотвращает дальнейшее продолжение чтения следующего элемента.

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

\0 - null terminator | ' ' - a space

Если вы хотите посчитать буквы, кроме пробела, попробуйте следующее:

#include <stdio.h>

#define MAX_LENGTH 100

int main(void) {
    char string[MAX_LENGTH];
    int letters = 0;

    printf("Enter a string: ");
    fgets(string, MAX_LENGTH, stdin);

    // string[i] in the For loop is equivalent to string[i] != '\0'
    // or, go until a null-terminator occurs
    for (int i = 0; string[i]; i++)
        // if the current iterated char is not a space, then count it
        if (string[i] != ' ')
            letters++;

    // the fgets() reads a newline too (enter key)
    letters -= 1;

    printf("Total letters without space: %d\n", letters);

    return 0;
}

Вы получите что-то вроде:

Enter a string: Hello world, how are you today?
Total letters without space: 26

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

...