Ввод строки до нажатия enter в Си

Нужно посчитать количество нажатых клавиш (символов) в строке, включая и пробелы и считывать до тех пор, пока не нажали "Enter".

int main()
{
    char str [100] = {0};
    int count = 0;
    for(int i = 0; str[i] != '\n'; i++)
    {
        scanf("%c", str[i]);
        count += 1;
    }

    return 0;
}

Программа почему - то не работает и выдает segmentation fault. Что делать?


Ответы (1 шт):

Автор решения: MikitaS

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

При вводе в str[i] видимо вводится больше символов чем 100, на что не хватает массива. Необходимо проверять количество введенных символов.

Для решения это задачи необходимо выделить память динамически при помощи calloc() или malloc(), а в случае если вместимости массива не хватает увеличивать при помощи realloc() вдвое.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    size_t capacity = 20, counter = 0;
    char *str = (char*)calloc(capacity, sizeof(char));

    str[counter] = getchar();

    while(str[counter] != '\n')
    {
        ++counter;
        if(counter == capacity)
        {
            capacity *= 2;
            str = (char*)realloc(str, capacity * sizeof(char));
        }

        str[counter] = getchar();
    }

    printf("the string is: >>%s<<\n", str);
    free(str);
    return 0;
}

А еще рекомендую использовать getchar() вместо scanf()

Вот как и обещал мое решение этой задачи, по-сути должно поддерживать очень длинный строки.

→ Ссылка