我用C语言编写UNIX shell。 一切正常,但是当我按下ENTER而没有引入任何字符时,应该显示提示时出现换行符。
这是我接收命令的循环。 ' \ n' char不在' 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);
}
答案 0 :(得分:1)
小心字符串中的第一个\ n - 它不仅会导致读取换行符(连续的空格),而且所有的CONSECUTIVE空格,"以及它(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)。格式字符串中的单个空格验证从流中提取的任何数量的空白字符(包括无)。
非空白字符,格式说明符(%)除外:任何不是空白字符(空格,换行符或制表符)或格式说明符的一部分(以%字符开头)的字符都会导致函数读取流中的下一个字符,将其与此非空白字符进行比较,如果匹配,则将其丢弃,并继续使用下一个格式字符。如果字符不匹配,则函数失败,返回并保留流的后续字符未读。
格式说明符:由初始百分号(%)组成的序列表示格式说明符,用于指定要从流中检索并存储到其他参数指向的位置的数据的类型和格式