【问题标题】:Is there a function in C that does the same as raw_input in Python?C 中是否有与 Python 中的 raw_input 相同的函数?
【发布时间】:2010-03-23 01:03:14
【问题描述】:

是否有与 Python 中的 raw_input 相同的 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获取用户类型,但随后挂起并退出..??

【问题讨论】:

  • 如果你习惯了python,你可能更喜欢C++,为什么你特别想要C?
  • 因为我正在大学里学习它:),我真的很想学习它:D

标签: python c raw-input


【解决方案1】:

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

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

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

【讨论】:

  • fflush(stdout);这是什么意思??
  • @Rami,很多printf() 实现实际上直到换行符才刷新输出。如果您希望提示在同一行,则必须强制系统刷新输出。
【解决方案2】:

POSIX.1-2008 标准指定了函数getline,它将动态(重新)分配内存以为任意长度的行腾出空间。

这比gets 的好处是不会溢出固定缓冲区,并且比fgets 的好处是能够处理任何长度的行,但如果行长度为比可用堆空间长。

在 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 */

【讨论】:

  • 想解释一下你的平淡断言,即 fgets 不安全?它并不完美,但除非你传递了错误的参数,否则我几乎不会说它是不安全
  • 哦。显然我在想getsfgets 有一个长度参数,因此不会以同样的方式受到攻击。我会解决的。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    我认为这更容易:

    #include "stdio.h"
    
    int main()
    {
       char array[100];
    
       printf("Type here: ");
       gets(array);
       printf("You said: %s\n", array);
    
       return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      相关资源
      最近更新 更多