在C中制作一个看起来不错的REPL

时间:2014-03-14 08:56:36

标签: c loops read-eval-print-loop tui

我正在使用类似Shell的界面编写小程序。 我的ui是:

void cli_ui(void){
    bool loop = true ;
    char response[CHARSIZE];
    while (loop) {
    puts("cofre>");
    fgets(response, CHARSIZE, stdin);
    ....
    }

}

我的问题是在提示符后读取输入:

cofre>
# input is expected here

我想要的是:

cofre> #input is expected here

你会怎么做?

3 个答案:

答案 0 :(得分:3)

问题是puts()写入字符串并用换行符替换尾部空值,这会产生一个新行。

答案是使用fputs()。有些令人惊讶的是,fputs()与puts()的作用不同,而是输出没有尾部换行符的字符串。如此。

fputs("cofre>", stdout);

有些人会建议你使用printf(),但这是一个错误。当你使用fgets()时,你应该将它与fputs()配对。好处是您明确使用标准输入和输出,因此您将能够从脚本中驱动REPL。

请注意,在某些实现中,fgets()和fputs()可能会被缓冲,而这不是您想要的。在某些情况下,您可能需要使用低级I / O,例如cputs / cgets()。这些都是非标准的。

答案 1 :(得分:2)

puts() writes the string s and a trailing newline to stdout.

使用

printf("cofre>");

答案 2 :(得分:2)

您可以使用printf代替puts