C - ошибка сегментации при использовании strlen?

Я получаю ошибку сегментации при использовании strlen.

Моя функция:

void myFunction() 
{
    int counter = 0;
    char * userInput;
    bool validInput = true;

    while (1) 
    {
        validInput = true;
        printf("\nEnter a word: ");
        scanf("%s", userInput);

        for(counter = 0; counter < strlen(userInput); counter++)
        {
            if (islower(userInput[counter]) == 0)
            {
                validInput = false;
                break;
            }
            if (isalpha(userInput[counter]) == 0)
            {
                validInput = false;
                break;
            }
        }

        if (!validInput)
        {
            printf("Please enter a wordcontaining only lower-case letters.\n");
            continue;
        }

        // Do something
        break;
    }
}

Что-то не так с моей строкой scanf? Раньше у меня никогда не было таких проблем с использованием strlen ... поэтому я предполагаю, что, возможно, я неправильно читаю ввод пользователя в «userInput».


person User10505    schedule 05.12.2017    source источник
comment
вы не выделяете память для userInput   -  person yano    schedule 06.12.2017
comment
Неопределенное поведение для использования значения объекта с автоматическим сроком хранения, пока оно не определено.   -  person EOF    schedule 06.12.2017
comment
Вы передаете дикий указатель на scanf(), а затем на strlen(); может произойти все, что угодно. Ожидается, что вы передадите указатель, указывающий на достаточное хранилище для строки, которую вы хотите отсканировать.   -  person John Bollinger    schedule 06.12.2017
comment
Ааа, хорошо, спасибо, я попробую это... имеет смысл! Все еще пытаюсь привыкнуть к C   -  person User10505    schedule 06.12.2017


Ответы (2)


 char * userInput;

Вышеупомянутая переменная является указателем, и она указывает в никуда (означает отсутствие места в памяти).

Он должен содержать адрес для хранения/получения данных.

Так что либо вы должны выделить память для этой переменной, либо использовать strdup

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

int main(int argc,char *argv[])
{
    char *inputStr; //wrong.
    char inputStrArray[100]; //correct
    char *inputStrPtr = malloc(sizeof(char)*100) ;//OK but dont forget to free the memory after use
    int condition = 1;

    while(condition )
    {
        printf("Please enter a string :");
        //scanf("%s",&inputStr); //wrong
        //printf(inputStr);
        scanf("%s",inputStrArray);
        printf("Ok I got it %s \n",inputStrArray);
        printf("Please enter one more time a string: ");
        scanf("%s",inputStrPtr);
        printf("Now I got it %s \n",inputStrPtr);
        condition = 0;

    }
    free(inputStrPtr);
    inputStrPtr = NULL; //try not to use it anywhere else
    return 0;
}
person cslrnr    schedule 06.12.2017
comment
Вы также должны предотвратить переполнение буфера, например. scanf("%99s", inputStrArray); - person M.M; 06.12.2017

Вместо этого используйте char userInput[128];.

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

person NeRa    schedule 05.12.2017
comment
Вместо этого используйте char userInput[128];. Затем пользователь вводит 150 символов ввода... - person Andrew Henle; 06.12.2017
comment
Это был простой пример - printf говорит ввести слово, я не помню слов, длиннее 128 символов. - person NeRa; 06.12.2017
comment
вы также можете сделать char *userInput = NULL. затем userInput = realloc(userInput,sizeof(char)*(++userInputSize)) перед каждым getc - person TheAschr; 06.12.2017