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

时间:2016-04-14 17:50:07

标签: c strtok

我试图通过使用 strtok()分割来从c程序中输入字符串中的个别数字,如 1 2 3 4,5 6 7 8,9 10 11 12 强>功能。为此,我写了下面的编程,但它是读到第一个逗号分隔符(注意:输入大小可能会有所不同。就像在给定的示例中逗号是在4位数之后,但它可以在k之后(5,6, 7等基于给出测试用例的数字。)

 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, ",");
   }

2 个答案:

答案 0 :(得分:0)

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, ",");
}

答案 1 :(得分:0)

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