Как читать строку с клавиатуры с помощью C? получение ошибки сегментации, проходящей в char *

Я хочу прочитать строку, введенную пользователем. Я не знаю длины веревки. Поскольку в C нет строк, я объявил указатель:

char * word;

и использовать scanf для чтения ввода с клавиатуры:

scanf("%s" , word) ;

но у меня ошибка сегментации.

как я могу прочитать ввод с клавиатуры в C, когда длина неизвестна ?

5 ответов


у вас нет хранилища, выделенного для word - это просто оборванных указатель.

изменения:

char * word;

в:

char word[256];

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

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


Я не понимаю, почему есть рекомендация использовать scanf() здесь. scanf() безопасно только при добавлении параметров ограничения в строку формата-например,%64s или так.

гораздо лучший способ-использовать char * fgets ( char * str, int num, FILE * stream );.

int main()
{
    char data[64];
    if (fgets(data, sizeof data, stdin)) {
        // input has worked, do something with data
    }
}

(непроверенные)


при чтении ввода из любого файла (включая stdin) , где вы не знаете длину, часто лучше использовать getline, а не scanf или fgets, потому что getline будет обрабатывать выделение памяти для вашей строки автоматически, пока вы предоставляете нулевой указатель для получения введенной строки. Этот пример иллюстрирует:

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

int main (int argc, char *argv[]) {

    char *line = NULL;  /* forces getline to allocate with malloc */
    size_t len = 0;     /* ignored when line = NULL */
    ssize_t read;

    printf ("\nEnter string below [ctrl + d] to quit\n");

    while ((read = getline(&line, &len, stdin)) != -1) {

        if (read > 0)
            printf ("\n  read %zd chars from stdin, allocated %zd bytes for line : %s\n", read, len, line);

        printf ("Enter string below [ctrl + d] to quit\n");
    }

    free (line);  /* free memory allocated by getline */

    return 0;
}

соответствующие части:

char *line = NULL;  /* forces getline to allocate with malloc */
size_t len = 0;     /* ignored when line = NULL */
/* snip */
read = getline (&line, &len, stdin);

задание line to NULL заставляет getline выделять память автоматически. Пример вывода:

$ ./getline_example

Enter string below [ctrl + d] to quit
A short string to test getline!

  read 32 chars from stdin, allocated 120 bytes for line : A short string to test getline!

Enter string below [ctrl + d] to quit
A little bit longer string to show that getline will allocated again without resetting line = NULL

  read 99 chars from stdin, allocated 120 bytes for line : A little bit longer string to show that getline will allocated again without resetting line = NULL

Enter string below [ctrl + d] to quit

поэтому с getline вам не нужно угадывать, как долго будет строка вашего пользователя.


#include<stdio.h>

int main()
{
    char str[100];
    scanf("%[^\n]s",str);
    printf("%s",str);
    return 0;
}

input: прочитайте строку
ouput: печать строки

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


вам нужно иметь указатель, чтобы указать где-то, чтобы использовать его.

попробуйте этот код:

char word[64];
scanf("%s", word);

это создает массив символов lenth 64 и считывает входные данные. Обратите внимание, что если входные данные длиннее 64 байт, массив слов переполняется, и ваша программа становится ненадежной.

Как указал Йенс, было бы лучше не использовать scanf для чтения строк. Это было бы безопасным решением.

char word[64]
fgets(word, 63, stdin);
word[63] = 0;