【问题标题】:Using token with different delimiters使用带有不同分隔符的标记
【发布时间】:2019-06-10 13:59:21
【问题描述】:

我正在尝试将所有整数放入一个数组中,它们之间有分隔符

我希望看到什么

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;
}

【问题讨论】:

  • 你永远不会寻找分号。
  • @David 最好把循环写成 while(token != NULL){ /* ...*/ kk++;令牌 = strtok( NULL, seps ); }

标签: c string token strtok


【解决方案1】:

并非所有分隔符都包含在数组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 2 3 @ array[0][1] = 1 array[1][1] = 2 array[2][1] = 3 如果有“;”他们之间的字符串
【解决方案2】:

你不能用strtok 做到这一点,至少不容易,因为strtok 会删除它找到的任何分隔符,而没有任何指示它们是什么。所以涉及区分不同类型分隔符的问题不适用于strtok

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

如果您要查找数字,您会发现strtol(或浮点数的strtod)非​​常有用,因为它既提取数字又告诉您数字的结束位置。然后,您可以检查指定端点处的字符,然后在下一个字符处重新开始扫描。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多