C语言中有没有类似Python的raw_input函数?
有没有一个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);
你可能还想加一些错误检查等等。