如何在不使用scanf()
或fgets()
我想从用户扫描命令行,并根据第一个单词识别命令。 例如: mkdir
所以我需要认识到用户想要创建一个名为“dir_name”的新目录。
我的代码:
gets()
当我在输入第一句后运行此代码并按回车键进入无限循环时我不知道为什么?
答案 0 :(得分:8)
你的问题很可能在这里:
char *ch=malloc(sizeof("50");
首先,你错过了一个接近的括号。但假设这是在发布问题而不是实际代码中的拼写错误,则存在更深层次的问题。
双引号内的 "50"
是一个字符串文字。当sizeof()
应用于字符串文字时,您将获得字符串中的字符数,包括终止NUL
。所以你只在ch
中为三个字符分配空间。
当您尝试scanf()
输入时,您正在写出超过三个字符缓冲区ch
的末尾。遗漏sizeof()
并简单地说:
char* ch = malloc (50);
此外,扫描集%[^\n]
会不跳过前导空格。您的第一个scanf()
将停在换行符处,该换行符将保留在缓冲区中。 scanf()
循环中的后续while
次呼叫将遇到该换行符并尽职尽责地停止,因为它已从扫描集中排除。所以循环条件
while (strcmp (ch, "exit"))
永远不会成为现实,你将获得无限循环。在scanf()
之后使用换行符以避免此问题:
scanf ("%[^\n]%*c", ch);
%*c
表示“读取一个字符然后丢弃它”。因此它将读取缓冲区中剩余的\n
,然后不将其保存在任何位置。因此,您的下一个scanf()
将不会在缓冲区的开头遇到\n
,并且您的程序将按预期运行。
答案 1 :(得分:1)
x
答案 2 :(得分:0)
scanf(“%[^ \ n] s”,s);您也可以使用scanf(“%[^ \ n]%* c”,s);其中s定义为char s [MAX_LEN],其中MAX_LEN是s的最大大小。这里,[]是扫描集字符。 ^ \ n代表输入,直到没有换行为止。然后,使用此%* c读取换行符,在这里使用的*表示该换行符已被丢弃。