4

raw_input是否有与Python中相同的 C 函数?

#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获取用户类型,但随后挂起并退出.. ??

4

4 回答 4

8

你可以很容易地写一个,但你要小心缓冲区溢出:

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

您可能想要添加一些错误检查,等等。

于 2010-03-23T01:08:07.400 回答
3

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)完成后记住。


要读入固定大小的缓冲区,请使用fgetsscanf("%*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 */
于 2010-03-23T02:42:00.050 回答
0

用于printf打印您的提示,然后用于fgets阅读回复。

于 2010-03-23T01:08:16.607 回答
0

选定的答案对我来说似乎很复杂。

我认为这更容易:

#include "stdio.h"

int main()
{
   char array[100];

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

   return 0;
}
于 2015-04-14T19:49:03.473 回答