无法从 c 中的给定格式拆分输入字符串?

Not able to split input string from the given format in c?

我试图通过使用 strtok() 函数。为此,我在下面编写了程序,但它一直读到第一个逗号 , 定界符(注意:输入大小可能会有所不同。就像在给定的示例中,逗号在 4 位数字之后,但它可以在 k(5 ,6,7, etc) 基于给定测试用例的数字)。

 fgets(str,80,stdin);

 /* read str with comma(,)delimiter  */
 token = strtok(str, ","); 

 /* walk through other tokens */
  while( token != NULL ) 
   {

       // read token string with space delimiter 
       token2 = strtok(token, " ");
       while( token2 != NULL ) 
       {
            printf("%s \n", token2);    
            token2 = strtok(NULL, " ");
       }

      token = strtok(NULL, ",");
   }

strtok 的实现使用传递给它的最后一个非 NULL 字符串。

因此,行:

token = strtok(NULL, ",");

无效。

如果你知道令牌的确切数量,你可以使用sscanf

/* read str with comma(,)delimiter  */
token = strtok(str, ","); 

/* walk through other tokens */
while( token != NULL ) 
{
   int num1;
   int num2;
   int num3;
   int num4;

   if ( sscanf(token, "%d %d %d %d", &num1, &num2, &num3, &num4) != 4 )
   {
      // Problem.
   }
   else
   {
      // Use the numbers
   }

   token = strtok(NULL, ",");
}

strtok 不可重入——您一次只能标记一个字符串。如果您想一次同时标记多个字符串,请改用 strtok_r。更好的是,始终优先使用 strtok_r 而不是 strtok,因为它的能力永远不会降低:

char *inner, *outer;
fgets(str,80,stdin);

/* read str with comma(,)delimiter  */   
token = strtok_r(str, ",", &outer);

/* walk through other tokens */
while( token != NULL ) 
{

    // read token string with space delimiter 
    token2 = strtok_r(token, " ", &inner);
    while( token2 != NULL ) 
    {
        printf("%s \n", token2);    
        token2 = strtok_r(NULL, " ", &inner);
    }

    token = strtok_r(NULL, ",", &outer);
}

您可能还想调查 strsep