Есть ли функция C, которая делает то же самое, что и raw_input
в Python?
#in Python::
x = raw_input("Message Here:")
Как я могу написать что-то подобное в C?
Обновление::
Я делаю это, но я получаю сообщение об ошибке::
#include<stdio.h>
#include<string.h>
#include "stdlib.h"
typedef char * string;
int raw_input(string msg);
string s;
string *d;
main(){
raw_input("Hello, Enter Your Name: ");
d = &s;
printf("Your Name Is: %s", s);
}
int raw_input(string msg){
string name;
printf("%s", msg);
scanf("%s", &name);
*d = name;
return 0;
}
и ошибка в том, что программа запускается и печатает сообщение msg, и берет какой тип пользователя scanf, но потом он зависает и выходит..??
Вы можете написать один довольно легко, но вам нужно быть осторожным в переполнении буфера:
void raw_input(char *prompt, char *buffer, size_t length)
{
printf("%s", prompt);
fflush(stdout);
fgets(buffer, length, stdin)
}
Затем используйте его следующим образом:
char x[MAX_INPUT_LENGTH];
raw_input("Message Here:", x, sizeof x);
Возможно, вы захотите добавить некоторую проверку ошибок и т.д.
printf()
самом деле не сбрасывают вывод до символа новой строки. Если вы хотите, чтобы подсказка была в одной строке, вы должны заставить систему сбросить вывод.
POSIX.1-2008 стандарт определяет функцию getline, который динамически (повторно) выделяет память для создания пробела для строки произвольной длины.
Это имеет преимущество перед gets
быть неуязвимым для переполнения фиксированного буфера, а преимущество над fgets
заключается в возможности обрабатывать строки любой длины за счет потенциальной DoS, если длина строки равна дольше, чем доступное пространство кучи.
До поддержки POSIX 2008 Glibc разоблачил это как расширение GNU.
char *input(const char *prompt, size_t *len) {
char *line = NULL;
if (prompt) {
fputs(prompt, stdout);
fflush(stdout);
}
getline(&line, len, stdin);
return line;
}
Запомните free(line)
после того, как вы закончите с ним.
Для чтения в буфер фиксированного размера используйте fgets
или scanf("%*c")
или аналогичные; это позволяет указать максимальное количество символов для сканирования, чтобы предотвратить переполнение фиксированного буфера. (Нет причин когда-либо использовать gets
, это небезопасно!)
char line[1024] = "";
scanf("%1023s", line); /* scan until whitespace or no more space */
scanf("%1023[^\n]", line); /* scan until newline or no more space */
fgets(line, 1024, stdin); /* scan including newline or no more space */
gets
. fgets
имеет параметр длины и, таким образом, уязвим таким же образом. Я исправлю это.
Выбранный ответ кажется мне сложным.
Я думаю, что это немного проще:
#include "stdio.h"
int main()
{
char array[100];
printf("Type here: ");
gets(array);
printf("You said: %s\n", array);
return 0;
}
Используйте printf
для печати приглашения, а затем fgets
, чтобы прочитать ответ.