我需要接受用户输入并将第一个'string'(直到空格)存储在名为'cmd'的变量中,将其余的输入存储在名为'input'的变量中。假设用户输入为'/ bin / ls',cmd将采用'/ bin / ls',但是,我希望输入保持为空,它打印为'L ????'。
请注意,如果用户输入为'/ bin / ls -a',则cmd采用'/ bin / ls',输入将根据需要采用'-a'。
scanf("%s%[^\n]s", cmd, input);
printf("CMD: %s \nINPUT %s", cmd, input);
有人可以解释为什么会这样吗?如果可能的话,我怎么能解决这个问题(例如,有一种方法可以使'%[^ \ n] s'只存储输入,如果有输入?)。如果有任何帮助,它将在MINIX中执行。
值得指出的是,我对C编程很陌生。
答案 0 :(得分:0)
如果您的输入字符串为scanf
,则input
来电未写入"/bin/ls"
,因此"L????"
必须已在input
之前{ {1}}致电。
为了找出scanf
是否读取了第二个标记,您可以检查scanf
的返回值:它将返回它成功读取的标记数。
答案 1 :(得分:0)
注意@DevSolar comment,请勿使用*scanf()
来阅读输入
最好使用fgets()
(或* nix中的getine()
)和然后解析。
scanf("%s%[^\n]s", cmd, input);
不检查结果值。这会导致各种麻烦,因为代码不知道输入是否成功。 @Zeta。
当发生部分读取时,如在OP的情况下,目标变量的剩余值不会改变 - 这就是代码打印"L????"
。
发生罕见输入错误时,目标变量的值不是定义的!
因此,请始终检查*scanf()
是否已按要求完成。
建议的解决方案:
char buf[256];
if (fgets(buf, sizeof buf, stdin) != NULL) {
char cmd[sizeof buf];
char input[sizeof buf];
switch (sscanf(buf, "%s %[^\n]", cmd, input)) {
case 2: printf("CMD: %s INPUT %s\n", cmd, input); break;
case 1: printf("CMD: %s\n", cmd); break;
default: printf("No CMD:\n");
}
}
注意:"s"
中的最终"%s%[^\n]s"
没有任何意义。 @ameyCU放弃它。