#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
как achar *
, но на самом деле это указывает на буквенную строку , которая является aconst
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);
}