C语言中有没有类似Python的raw_input函数?

4 投票
4 回答
6385 浏览
提问于 2025-04-15 20:43

有没有一个C语言的函数,功能和Python里的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获取用户输入,但之后程序就卡住了,然后退出了.. ??

4 个回答

0

先用 printf 来显示你的提示信息,然后用 fgets 来读取用户的回复。

4

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

记得在使用完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 */
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);

你可能还想加一些错误检查等等。

撰写回答