Разделить символ [] и сохранить значение в разных массивах C - PullRequest
1 голос
/ 10 марта 2019

Я новичок в программировании на C и у меня проблема:

У меня есть строка:

char input[] = "1000 10 30: 1 2 3";

Я хочу разделить входные данные и сохранить значения в разных массивах, "1000 1030 "в одном массиве и" 1 2 3 "в другом массиве.

Я пытался использовать strtok (), но я не могу найти решение, чтобы сделать это.

Кто-нибудь знает, как это сделать?

Спасибо!

Редактировать: Спасибо, вот остаток кода:

int a1[3];
int a2[3];
char input[] = "1000 10 30:400 23 123";


char*c = strtok(input, ":");

while (c != 0)
{

    char* sep = strchr(c, ' '); 
    if (sep != 0)
    {
        *sep = 0; 
        a1[0] = atoi(c);

        ++sep;
        *sep = strtok(sep, " ");
        a1[1] = atoi(sep);

        ++sep;
        a2[2] = atoi(sep);

    }

    c = strtok(0, ":");

Я использовалПример я нашел здесь и попытался изменить его, чтобы добавить больше элементов в массив, но не смог сделать это.третий элемент почему-то равен 0, и я не понимаю, почему.Я начинающий ++ программист, но в основном C #, и раньше я не использовал указатели.

1 Ответ

2 голосов
/ 10 марта 2019

Мне неясно, что вы пытаетесь делать с указателем sep. И этот код

*sep = strtok(sep, " ");

должен выдавать вам предупреждения компилятора, поскольку strtok возвращает указатель на символ, и вы пытаетесь сохранить его в символе (он же *sep).

Вам не нужно больше, чем strtok, поскольку вы можете задать ему несколько разделителей, то есть вы можете указать как ' ', так и ':', передав ему " :".

Так что код может выглядеть так:

int main() {
    char input[] = "1000 10 30: 1 2 3";
    int a1[3];
    int a2[3];
    int i = 0;
    char* p = strtok(input, " :");
    while(p)
    {
        if (i < 3)
        {
            a1[i] = atoi(p);
            ++i;
        }
        else if (i < 6)
        {
            a2[i-3] = atoi(p);
            ++i;
        }
        p = strtok(NULL, " :");
    }

    // Print the values
    for (int j = 0; j <i; ++j)
    {
        if (j < 3)
        {
            printf("a1[%d] = %d\n", j, a1[j]);
        }
        else if (j < 6)
        {
            printf("a2[%d] = %d\n", j-3, a2[j-3]);
        }
    }
}

Выход:

a1[0] = 1000
a1[1] = 10
a1[2] = 30
a2[0] = 1
a2[1] = 2
a2[2] = 3

Совет. Приведенный выше код решает задачу, но я рекомендую вам взглянуть на sscanf, поскольку он позволит вам читать значения одной строкой кода.

...