将令牌与不同的定界符一起使用

时间:2019-06-10 13:59:21

标签: c string token strtok

我正在尝试将所有整数放在一个带有分隔符的数组中

我希望看到的

array[0][0] = 0
array[0][1] = 1
array[1][1] = 2
array[2][1] = 3
array[0][2] = 4

我尝试过重用token = strtok(str,“;”),但是它删除了char“ 4”

#include <stdio.h>
#include <string.h>


int main()
{
char seps[] = " ,\t\n\r";
char *token;
char str[1000] = "0,1;2;3,4";
int kk=0;
int array[3][10];

token = strtok( str, seps );
while(1){
    sscanf(token,"%d",&(array[0][kk]));
    printf("Print Token %d\n",array[0][kk]);
    //If token has ; move to next place in 1st array
    token = strtok( NULL, seps );
    kk++;
    if (token==NULL)
        break;
 }

 return 0;
}

2 个答案:

答案 0 :(得分:0)

并不是所有的分隔符都包含在数组seps中。

另外,while循环应写为

token = strtok( str, seps );
while( token != NULL )
{
    // ...
    ++kk;
    token = strtok( NULL, seps );
}

这是一个演示程序

#include <stdio.h>
#include <string.h>

int main( void ) 
{
    const char seps[] = " ;,\t\n\r";
    char *token;
    char str[1000] = "0,1;2;3,4";
    int array[3][10];

    size_t i = 0;
    token = strtok( str, seps );

    while ( token != NULL )
    {
        sscanf( token, "%d", &array[0][i] );

        printf( "%d ", array[0][i] );

        ++i;

        token = strtok( NULL, seps );
    }

    return 0;
}

其输出为

0 1 2 3 4 

答案 1 :(得分:0)

使用strtok至少不能轻易做到这一点,因为strtok会删除找到的所有定界符而没有任何指示。因此,涉及区分不同类型的定界符的问题不适合strtok

我建议您尝试一种尝试匹配要提取的字段的方法,然后检查匹配字段后的定界符。 (您可能也想跳过空格,但这是一个简单的修改。)

如果您要查找数字,您会发现strtol(对于浮点数,则为strtod),因为它既可以提取数字,又可以告诉您数字的结尾。然后,您可以在指示的端点检查字符,然后在此之后的下一个字符重新开始扫描。