Как читать строку с клавиатуры с помощью 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;