char *s;
printf("enter a word \n");
scanf("%s",s);
scanf
с %s
не выделяет память, вместо этого он считывает данные в буфер, который вы предоставляете (например, s = malloc(100);
. Насколько большим должен быть этот буфер, чтобы избежать Переполнение буфера? К сожалению, это может быть слишком долго до символа пробела, поэтому это небезопасно по своей природе.
Вы можете указать максимальный фронт (не включая нулевой терминатор!), но для обработки переменного размера вам необходимо динамически построить строку формата, которая становится сложной. Как и то, что делать, если пользователь вводит строку слишком долго.
char s[100];
scanf("%99s", s);
Поскольку вы пометили C ++, вы можете использовать std::string
и потоки ввода-вывода (например, std::cin
для консольного ввода), который будет обрабатывать все выделение памяти для вас.
std::string s;
std::cout << "enter a word" << std::endl;
std::cin >> s;
В случае C, вы можете использовать fgets(str, num, stream)
, это позволяет вам указать максимальную длину и избежать переполнения в простой способ.
char s[128];
fgetsf(s, 100, stdin);
Или с POSIX 2008 scanf
он может выделить память , но я не верю, что это универсально поддерживается, например, Microsoft Visual Studio.
char *s = 0;
scanf("%ms", &s); // pass a pointer to a pointer!
free(s); // needs to be freed later!