Вопрос по string, char, c, arrays – C разбить массив символов на разные переменные

9

В C, как я могу отделить массив символов с помощью разделителя? Или лучше манипулировать строкой? Каковы некоторые хорошие функции манипулирования C char?

возможный дубликатSplit string with delimiters in C Greg Bacon

Ваш Ответ

6   ответов
10

смотреть наstrtok (). strtok () не является входящей функцией.

strtok_r() является возвращаемой версией strtok (). Вот пример программы из руководства:

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

   int main(int argc, char *argv[])
   {
       char *str1, *str2, *token, *subtoken;
       char *saveptr1, *saveptr2;
       int j;

       if (argc != 4) {
           fprintf(stderr, "Usage: %s string delim subdelim\n",argv[0]);
           exit(EXIT_FAILURE);
       }

       for (j = 1, str1 = argv[1]; ; j++, str1 = NULL) {
           token = strtok_r(str1, argv[2], &saveptr1);
           if (token == NULL)
               break;
           printf("%d: %s\n", j, token);

           for (str2 = token; ; str2 = NULL) {
               subtoken = strtok_r(str2, argv[3], &saveptr2);
               if (subtoken == NULL)
                   break;
               printf(" --> %s\n", subtoken);
           }
       }

       exit(EXIT_SUCCESS);
   }

Пробный прогон, который работает с субтокенами, которые были получены из предыдущего токена на основе другого разделителя:

$ ./a.out hello:word:bye=abc:def:ghi = :

1: hello:word:bye
 --> hello
 --> word
 --> bye
2: abc:def:ghi
 --> abc
 --> def
 --> ghi
Пример был бы великолепен.
Пожалуйста, не рекомендуюstrtok, это не реентерабельный. Его "взрослый брат"strtok_r намного лучше
это может манипулировать массивом символов или это должна быть строка? Daniel Del Core
@Thiruvalluvar: это не просто потокобезопасность - что, если вы хотите токенизировать две разные строки одновременно, например, в том же цикле?
@SSHЭтот пример уже есть в принятом ответе. Я не хочу повторять то же самое.
3

Я придумал это. Это, кажется, работает лучше всего для меня. Он преобразует строку числа и разбивает ее на массив целых чисел:

void splitInput(int arr[], int sizeArr, char num[])
{
    for(int i = 0; i < sizeArr; i++)
        // We are subtracting 48 because the numbers in ASCII starts at 48.
        arr[i] = (int)num[i] - 48;
}
13
#include<string.h>
#include<stdio.h>
int main()
{
    char input[16] = "abc,d";
    char *p;
    p = strtok(input, ",");

    if(p)
    {
    printf("%s\n", p);
    }
    p = strtok(NULL, ",");

    if(p)
           printf("%s\n", p);
    return 0;
}

Вы можете посмотреть эту программу. Во-первых, вы должны использовать strtok (input, & quot;, & quot;). input - это строка, которую вы хотите выделить. Затем вы используете strtok (NULL, & quot;). Если возвращаемое значение равно true, вы можете распечатать другую группу.

Спасибо за код, извините, тупой вопрос, почему вы используете strtok во второй раз? Кроме того, что значит & quot; Если возвращаемое значение равно true, вы можете распечатать другую группу. & Quot; имею в виду?
3

Вы можете просто заменить символы-разделители символами NULL и сохранить адрес после вновь созданного символа NULL в новом указателе char *:

char* input = "asdf|qwer"
char* parts[10];
int partcount = 0;

parts[partcount++] = input;

char* ptr = input;
while(*ptr) { //check if the string is over
    if(*ptr == '|') {
        *ptr = 0;
        parts[partcount++] = ptr + 1;
    }
    ptr++;
}

Обратите внимание, что этот код, конечно, не будет работать, если входная строка содержит более 9 символов-разделителей.

3

Одним из вариантов является strtok

пример:

char name[20];
//pretend name is set to the value "My name"

Вы хотите разделить его на расстояние между двумя словами

split=strtok(name," ");

while(split != NULL)
{
    word=split;
    split=strtok(NULL," ");
}
1

Вот как я это делаю.

void SplitBufferToArray(char *buffer, char * delim, char ** Output) {

    int partcount = 0;
    Output[partcount++] = buffer;

    char* ptr = buffer;
    while (ptr != 0) { //check if the string is over
        ptr = strstr(ptr, delim);
        if (ptr != NULL) {
            *ptr = 0;
            Output[partcount++] = ptr + strlen(delim);
            ptr = ptr + strlen(delim);
        }

    }
    Output[partcount++] = NULL;
}

Похожие вопросы