C从控制台读取多个带空格的单词/参数

C从控制台读取多个带空格的单词/参数,c,C,您好,我是C新手,我希望用户键入类似于inspect 2的内容,以显示该示例中位置2处的数组值 我不能让它工作 char input[20]; scanf("%s", input); if (strcmp(strtok(input, " "), "inspect") == 0) { char str[20]; int idx; printf("input was %s", input); idx = sscanf(input, "

您好,我是C新手,我希望用户键入类似于
inspect 2
的内容,以显示该示例中位置2处的数组值

我不能让它工作

    char input[20];
    scanf("%s", input);

    if (strcmp(strtok(input, " "), "inspect") == 0) {
     char str[20];
     int idx;
     printf("input was %s", input);
     idx = sscanf(input, "%s %d", str, &idx);
   }
它总是打印
输入was inspect
,但不读取以下空格和数字? 检查用户是否键入“inspect”并获取他以后键入的索引的正确方法是什么


谢谢你

你几乎没有选择,你要选择一个,不要把它们混在一起

用于读取输入,考虑使用FFET。更安全,需要处理的例外情况更少。我列出了等效的sscanf,但它更难使用。它们都将为“输入”带来一个完整的行。请注意,FGET还将包括尾随的新行

   // make buffer large enough.
char input[255] ;

if ( fgets(input, sizeof(input), stdin) != NULL ) {
   ...
}

// OR
if ( sscanf("%19[^\n]", input) = 1 ) {
} ;
用于解析:解析输入字符串的选项很少

在这两个选项之间,我将投票支持sscanf,因为它提供了针对错误输入、溢出等的最有效的验证和保护。当strtok返回NULL时,strcmp(strtok(…)很容易导致SEGV错误

使用sscanf

  if ( sscanf(input, "inspect %d", &idx) ==1 ) {
     ... Show Element idx
  } ;
使用strtok/strcmp

  if ( strcmp(strtok(input, " "), "inspect") == 0 ) {
      if ( sscanf("%d", strtok(NULL, " "), &idx) == 1 ) {
          .. Show element idx
      } ;
  } ;
使用strtol

  if ( strcmp(strtok(input, " "), "inspect") == 0 ) {
      char *stptr = strtok(input, " "), *endptr = NULL ;
      idx = strtol(stptr, &endptr, 10) ;
      if ( endptr != stptr ) {
          .. Show element idx
      } ;
  } ;

尽量不要使用极小的缓冲区,使用更安全的默认值,如
字符输入[255]
。如果正在使用此缓冲区,请将此缓冲区长度传递到
scanf
,以确保不会意外溢出:
scanf(“%255s”,&input)
。谢谢。但在使用此功能时,我仍然存在相同的问题,我必须删除输入前的
&
,以使其正常工作。
输入
将不包含任何空间供
strok
查找!
%s
说明符在第一个空白字符处停止扫描。使用
fgets
输入一行文本。对不起,我对这个太陌生了。如何使用fgets从控制台读取数据?使用
stdin
作为文件流。我尝试了它,但我的变量
input
似乎不包括上面评论中提到的空间和风向标号。我在xdrago评论之后扩展了fgets/scanf。