为什么scanf()返回'L ????'当string为null时?

时间:2015-11-19 13:28:55

标签: c scanf

我需要接受用户输入并将第一个'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编程很陌生。

2 个答案:

答案 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放弃它。