c - 扫描字符直到输入键

标签 c arrays linux shell

我正在用 C 语言编写 UNIX shell。 一切正常,但是当我按下 ENTER 之前没有引入任何字符时,应该显示提示时会有一个换行符。

这是我接收命令的循环。 第一次按下时,'\n' 字符不在 'text' 数组变量中。

void main(int argc, char **argv) {
    int i=0, final=FALSE, background=FALSE;
    char text[TAM_MAX];

    while (final == FALSE) {
        printf(PROMPT); 
        scanf("\n%[^\n]", text); // Scan until enter is pressed
        background = FALSE; 

        for(i=0; text[i] != '\0'; i++) { 
            if (text[i] == '&') { 
            text[i] = '\0';
            background = TRUE; // & > background instruction
        }
    }

    if (isFinal(text) == TRUE) break; // 'exit' was introduced
    executeCommand(text, background);
}

最佳答案

注意字符串中的第一个\n——它不仅会导致换行符(连续的空格)被读入,还会导致所有连续的空格被读入,"并且它 (scanf) 可能需要在之前读取另一行它可以找到第一个非空白字符。"

对于这段代码:

scanf("\n%[^\n]", text); // Scan until enter is pressed

如果仅先输入一个换行符,它将被丢弃。

但是这段代码中的第一个\n 也会导致任意数量的连续空白字符被读入——而不仅仅是一个。

scanf 可能期望读取并删除任何可能的 由于第一个\n 而增加的空白字符。来自 文档(见下文):

引用#1:

http://c-faq.com/stdio/scanfhang.html

"The \n in "%d\n" therefore causes scanf to read characters until 
it finds a non-whitespace character, and it may need to read another 
line before it can find that non-whitespace character."

引用#2:

http://c-faq.com/stdio/scanfhang.html

"Perhaps surprisingly, \n in a scanf format string does not mean to 
expect a newline, but rather to read and DISCARD characters <B>as 
long as each is a whitespace character</B>. (In fact, ANY 
whitespace character in a scanf format string means to read and 
discard whitespace characters."

来自文档:

http://www.cplusplus.com/reference/cstdio/scanf/

空白字符:该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空白字符包括空格、换行符和制表符——请参阅 isspace)。格式字符串中的单个空格验证从流中提取的任意数量的空格字符(包括无)。

非空白字符,格式说明符 (%) 除外:任何既不是空白字符(空格、换行符或制表符)也不是格式说明符的一部分(以 % 字符开头)的字符都会导致函数读取流中的下一个字符,将它与这个非空白字符进行比较,如果匹配,则将其丢弃,函数继续处理格式的下一个字符。如果字符不匹配,则函数失败,返回并留下未读流的后续字符。

格式说明符:由初始百分号(%)组成的序列表示格式说明符,用于指定要从流中检索并存储到附加参数指向的位置的数据的类型和格式.

关于c - 扫描字符直到输入键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30399181/

相关文章:

javascript - 将数组中的每个元素与其他每个元素进行比较

python - 从 virtualenv 中启动 wsgi 应用程序作为 Linux 系统服务

c++ - C header 的重复符号问题

c - c 中带有标识符的结构声明

c - 如何修复无法从 esp8266 响应读取serial.find ("OK")

c - 使用 free() 释放内存时遇到问题

arrays - Ruby - 比较数组并根据条件获取索引

java - 用正则表达式匹配规则替换每个单词的第一个元音

linux - 分析共享对象的核心文件

linux - u-boot 引导加载程序如何读取/保存其环境变量?