我正在用 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/