Объединить разделенные элементы char ** в C

#c #pointers

#c #указатели

Вопрос:

У меня следующая ситуация:

Начальный char* original_string = "@person Hello person! Welcome to the chat!";

Мне нужно было взять "@person" часть, поэтому у меня есть функция разделения, которая возьмет original_string и разделит ее пробелами. В основном char** split_original_string = split_string(original_string, " "); вернет:

     split_original_string[0] = "@person";
    split_original_string[1] = "Hello";
    split_original_string[2] = "person!";
    split_original_string[3] = "Welcome ";
    split_original_string[4] = "to";
    split_original_string[5] = "the";
    split_original_string[6] = "chat!";

 

Так как теперь у меня есть @person , я счастлив! Но я понял, что сообщение должно быть остальной частью original_string смысла "Hello person! Welcome to the chat!" .

Я пытался использовать что-то вроде

 char* message = malloc(256); // 256 is just for testing purposes
strncpy(message , original_string   strlen(split_original_string[0]), strlen(original_string ));
 

Но это привело к пустоте char* , потому что, по-видимому, при передаче original_string split_original_string функции она изменилась, и ее длина была равна длине split_original_string[0] .

Мой вопрос: есть ли способ объединить остальные char** элементы в один char* , используя for цикл или любой другой цикл?

Любая помощь приветствуется!

Комментарии:

1. Вероятно, вам нужно использовать strtok .

2. @Jabberwocky ты имеешь в виду это для разделения?

3. @JohnRambo Интересно, как ты получаешь «чат»; вместо «чат!»;

4. Да, это только начало. Скопируйте строку перед использованием strtok , потому что вы не можете использовать strtok ее в строковом литерале.

5.Берегитесь! Вы объявили original_string как a char * , но на самом деле это указывает на буквенную строку , которая является a const char * . Поскольку strtok строка модифицируется, ее использование поверх объекта const вызывает неопределенное поведение. Если вы хотите обрабатывать константные строки, вам лучше использовать str[c]spn те, которые выполняют почти ту же работу, strtok что и do, но никогда не меняют исходную строку.

Ответ №1:

Здесь у вас есть облегченная программа для архивирования этого. Нет внешних функций

 char *mySpecialstrcat(char *str, const char *src, int appendSpace)
{
    while(*str   = *src  );
    if(appendSpace) *(str - 1) = ' ';
    *str = 0;
    return str;
}

char *combine(char *buff, char **strings)
{
    char *end = buff;
    while(*strings)
    {
        end = mySpecialstrcat(end, *strings, strings[1] != NULL);
        strings  ;
    }
    return buff;
}

int main(void)
{
    char *buff = malloc(256);
    char *split_original_string[8];
    split_original_string[0] = "@person";
    split_original_string[1] = "Hello";
    split_original_string[2] = "person!";
    split_original_string[3] = "Welcome ";
    split_original_string[4] = "to";
    split_original_string[5] = "the";
    split_original_string[6] = "chat!";
    split_original_string[7] = NULL;


    printf("%sn", combine(buff, split_original_string));
    free(buff);
}