gpt4 book ai didi

c - 扫描字符直到输入键

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:55 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com