2016-04-17 3 views
0

Я хочу создать большую строку «дез» из 2 подстрок, скопированных из строки «ЮКЖД» таким образом:создания строки из 2 подстрок

Я хочу, чтобы скопировать подстроку, позволяет называть его - «string1» (от ptr x до конца строки «scr»), затем поместить его в «des», а затем конкатенировать его с помощью другой подстроки, разрешить вызов - «строка 2», скопированная из строки «scr» из глава строки в x ptr. Как я могу это сделать не используя временную строку?

, например: экр = "Thisis", string1 = "Is", STRING2 = "Это" дез = "IsThis"

Я не хочу использовать строку Темп держать строку 1 или string2 ,

Вы можете мне помочь?

+0

Действительно ли указатель 'des' равен' scr' указателю? – Marian

+0

Возможно, вы можете использовать memcpy(). это поможет вам. но убедитесь, что «des» имеет достаточно места для хранения всего содержимого. – sam

ответ

1

Вам не нужна строка temp, вам нужен только указатель, чтобы удерживать границу подстрок. Попробуйте следующее:

char src[] = "ThisIs"; 
char dst[7] = {'\0'}; 
int len = strlen(src); 
int str1len = 4; 
strncpy(dst, src + str1len, len - str1len); 
strncpy(dst + len - str1len, src, str1len); 
printf("src=%s, dst=%s\n", src, dst); 
1

Если вы знаете позицию второй строки, вы можете просто напечатать две подстроки в строку назначения в обратном порядке:

char *src = "ThisIs";  // source string 
char dst[7];    // char buffer for destination string 

int pos = 4;    // position of second substring 

snprintf(dst, sizeof(dst), "%s%.*s", src + pos, pos, src); 
puts(dst); 

Объяснение:

  • snprintf записывает форматированные данные в строку, так же как printf записывает форматированные данные на экран. Он берет длину буфера в качестве второго аргумента и использует его для обеспечения того, чтобы буфер не переполнялся. Он также гарантирует, что результирующая строка имеет нулевой конец.
  • Если вывод будет строкой с большим количеством символов, чем может удерживать буфер, выход усекается. snprintf возвращает длину, которая имела бы строка, если буфер был бесконечно большим. Вы можете использовать это возвращаемое значение, чтобы проверить, был ли результат усечен.
  • Вторая подстрока заканчивается нулью, потому что она заканчивается там, где заканчивается целая строка src. Вы можете распечатать его с помощью printf("%s", str + pos), где pos - начало подстроки.
  • Первая подстрока не завершена нулем. Вы можете распечатать подстроки любой длины, указав «точность» на формат %s после периода: printf("%.4s", str).
  • Вы можете сделать эту переменную точность, используя звездочку в формате, а затем обеспечивая дополнительный int аргумент до фактического аргумента: printf("%.*s", 4, str)

Этот ответ на сердце и тот же ответ, как fluter, но она защищает от буферов и требует меньших вычислений длины.

+0

На самом деле я пытаюсь скопировать RingBuffer в LinearBuffer. Давайте предположим, что RingBuffer мы имеем дело с типа: ' ЬурейеГо STRUCT { \t \t RingBuff_Data_t Buffer [BUFFER_SIZE];/** <Внутренние данные кольцевого буфера, на которые ссылаются указатели на буфер.*/ \t \t RingBuff_Data_t * In;/** <Текущее место хранения в кольцевом буфере */ \t \t RingBuff_Data_t * Out;/** <Текущее местоположение поиска в кольцевом буфере */ \t \t RingBuff_Count_t Count; } RingBuff_t; – Kobi

+0

Aha. Это совсем другой вопрос. (Потому что вам не нужно иметь дело с завершением нулевых символов и потому, что вы хотите иметь дело с любыми данными). Я полагаю, что позиции 'In' и' Out' являются указателями. (Астры были обработаны как * * курсивом * разметка.) –

+0

и мой код выглядит так: \t memset(linearBuffer,0,LINEAR_BUFFER_SIZE); \t RingBuff_Data_t* tempIn = buf.In; \t if (buf.Out < tempIn){ \t \t memcpy(linearBuffer,buf.Out,tempIn-buf.Out); \t } \t else if (buf.Out > tempIn){ \t \t strcpy(linearBuffer,buf.Out); \t \t strncpy(linearBuffer+strlen(buf.Out),buf.Buffer,buf.In-buf.Buffer); \t } , но я не уверен в этом. P.S, как мне добавить код, чтобы вы могли легко его прочитать ...? – Kobi

Смежные вопросы