Есть ли в C функция, которая делает то же самое, что и raw_input в Python?
Вопрос
Есть ли функция C, которая делает то же самое, что и raw_input
на питоне?
#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;
}
и ошибка в том, что программа запускается и печатает сообщение, и принимает ввод пользователя с помощью 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);
Возможно, вы захотите добавить проверку ошибок и т. д.
Другие советы
Тем POSIX.1-2008 стандарт определяет функцию получить линию, который будет динамически (пере)распределять память, чтобы освободить место для строки произвольной длины.
Это имеет преимущество перед 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 */
Использовать printf
чтобы распечатать приглашение, затем используйте fgets
чтобы прочитать ответ.
Выбранный ответ кажется мне сложным.
Я думаю, что это немного проще:
#include "stdio.h"
int main()
{
char array[100];
printf("Type here: ");
gets(array);
printf("You said: %s\n", array);
return 0;
}