копирование нескольких символов char * в одну переменную char * языка C - PullRequest
0 голосов
/ 11 июня 2010

Как я могу скопировать несколько переменных char * в один символ * при операции одного экземпляра.

скажем, у меня есть

char * text1 = "Hello";

char* text2 = "World";

я хочу скопировать text1, text2 и '2' и "12345" в char * text3 в одном вызове функции.

Ответы [ 8 ]

3 голосов
/ 11 июня 2010
char text3[100];
sprintf( text3, "%s%s%s%s", text1, text2, "2", "12345" ); 
2 голосов
/ 11 июня 2010

Это автоматически изменяет размер string3, поэтому оно может удерживать вывод без переполнения буфера

const char * string1 = "Hello";
const char * string2 = "World";
char * string3 = NULL;
size_t string3_size = snprintf(NULL,0,"%s%s%s",string1,string2,"1234");
string3 = realloc(string3,string3_size+1); // +1 for '\0'
snprintf(string3,string3_size+1,"%s%s%s",string1,string2,"1234");
2 голосов
/ 11 июня 2010

Для этого при одиночном вызове функции вам потребуется asprintf(), доступный на вашей платформе (или аналогичная реализация библиотеки). Большинство современных библиотек C предлагают его, однако вам, возможно, придется включить его как расширение через препроцессор.

Linux-ориентированный пример того, что вы хотите (то есть, я полагаю, чтобы вернуть выделенную / комбинированную строку):

#define _GNU_SOURCE /* Telling the compiler we want extensions */
#include <stdio.h>

int main(void)
{
   char *text1 = "foo";
   char *text2 = "bar";
   char *text3 = NULL;
   int bytes_printed = 0;

   bytes_printed = asprintf(&text3, "%s%s123456789", text1, text2);
   if (bytes_printed < 0 || text3 == NULL) {
      fprintf(stderr, "Asprintf failed to allocate memory!\n");
      return 1;
   }

   printf("Asprintf printed %d bytes to text3, which is %s\n",
      bytes_printed, text3);
   free(text3);
   return 0;
}

Это единственный способ сделать это при вызове функции single , возвращающей выделенную строку.

Чтобы обеспечить его переносимость, вам, вероятно, следует использовать его библиотечную реализацию в своем дереве, что-то вроде my_asprintf(), которое эффективно работает с системами, которые его не предлагают.

Вы можете извлечь его прямо из исходных текстов библиотеки C для glibc, я полагаю, BSD, даже новые операционные системы, такие как HelenOS, предлагают его.

0 голосов
/ 11 июня 2010

Я думаю, что вы не понимаете здесь, что "string" в C - это выражение, которое оценивает один символьный указатель на символ 's', который статически выделяется в памяти.Который имеет 't' в следующем адресе, затем 'r', все до 'g' и затем после этого null символ.Вот как в C работают строки, так с ними справляются библиотечные функции.Они просто пересекают их, пока не найдут null.

Так что в этом случае вам нужно удалить последний null из "Hello" и просто заменить его остальными.strcat делает это, он берет указатели на символы, за которыми следуют другие символы, и, наконец, нулевой символ.И возвращает новый указатель на другой символ, который указывает на начало их объединения в памяти.

0 голосов
/ 11 июня 2010

Используйте функцию sprintf и печатайте все строки в строку результата.

0 голосов
/ 11 июня 2010

Как то так?

char* text1 = "Hello";
char* text2 = "World";
char* phrase = (char *)malloc((char)*15);
snprintf(phrase, 15, "%s %s", text1, text2);
0 голосов
/ 11 июня 2010

попробуйте это Функция strcat ():

когда вы объединяете две строки, вы добавляете символы одной строки в конец другой строки. Этот процесс называется конкатенацией. Функция strcat () объединяет 2 строки вместе. Принимает следующую форму

strcat (string1, string2)

string1 & string2 являются символьными массивами. Когда функция strcat выполняется, строка2 добавляется к строке1. строка в string2 остается неизменной.

Пример

зЬгср (строка1,»шри»); зЬгср (строка2,»Бхагаван»); Е ( «% s», strcat (строка1, строка2);

Из вышеприведенного сегмента программы значение строки1 становится sribhagavan. Строка в str2 остается неизменной как bhagawan.

0 голосов
/ 11 июня 2010

Sprintf


Это должно сработать:

sprintf(test3, "%s%s%s%s", text1, text2, "2" , "12345");

GOODLUCK !!
- CVS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...