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

1

Есть ли функция 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, но потом он зависает и выходит..??

  • 1
    Если вы привыкли к Python, вы можете предпочесть C ++, почему вы особенно хотите C?
  • 0
    потому что я изучаю это в университете :), и я действительно хочу изучать это: D
Теги:
raw-input

4 ответа

5
Лучший ответ

Вы можете написать один довольно легко, но вам нужно быть осторожным в переполнении буфера:

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);

Возможно, вы захотите добавить некоторую проверку ошибок и т.д.

  • 0
    fflush (стандартный вывод); что это означает ??
  • 1
    @Rami, многие реализации printf() самом деле не сбрасывают вывод до символа новой строки. Если вы хотите, чтобы подсказка была в одной строке, вы должны заставить систему сбросить вывод.
2

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 */
  • 1
    Не хочешь объяснить твое легкое утверждение, что fgets небезопасен? Он не идеален, но если вы не укажете неправильные параметры, я бы вряд ли сказал, что это небезопасно .
  • 0
    Ой. Очевидно , что я имел в виду gets . fgets имеет параметр длины и, таким образом, уязвим таким же образом. Я исправлю это.
0

Выбранный ответ кажется мне сложным.

Я думаю, что это немного проще:

#include "stdio.h"

int main()
{
   char array[100];

   printf("Type here: ");
   gets(array);
   printf("You said: %s\n", array);

   return 0;
}
0

Используйте printf для печати приглашения, а затем fgets, чтобы прочитать ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню