Использование токена с разными разделителями - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь поместить все целые числа в массив с разделителями между ними

Что я ожидал бы увидеть

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

Я попытался повторно использовать token = strtok (str, ";") но он удаляет символ" 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 голосов
/ 10 июня 2019

Вы не можете сделать это с strtok, по крайней мере, не легко, потому что strtok стирает любые разделители, которые он находит, без указания того, кем они были. Таким образом, проблемы, связанные с различением различных типов разделителей, не подходят для strtok.

Я бы предложил вам попробовать подход, который пытается сопоставить поля, которые вы хотите извлечь, а затем проверить символ разделителя, который следует за соответствующим полем. (Возможно, вы также захотите пропустить пробелы, но это простая модификация.)

Если вы ищете числа, вы обнаружите, что strtol (или strtod для числа с плавающей запятой) очень полезно, потому что оно извлекает число и сообщает вам, где число заканчивается. Затем вы можете проверить символ в указанной конечной точке и перезапустить сканирование для следующего символа после этого.

0 голосов
/ 10 июня 2019

Не все разделители включены в массив 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 
...