Есть ли в C функция, которая делает то же самое, что и raw_input в Python?

StackOverflow https://stackoverflow.com/questions/2496857

  •  21-09-2019
  •  | 
  •  

Вопрос

Есть ли функция 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top