2015-08-17 4 views
1

Я делаю динамический запрос PUT с помощью конкатенации строк с C. Моя проблема в том, что после первого запроса строка, которая мне нужна, чтобы оставаться статической putEndpoint, изменяется с помощью string concatenation Я использую его для.Конкатенация строк без изменения исходных значений - C

char putEndpoint[] = "PUT /api/v1/products/"; 
char http[] = " HTTP/1.1"; 
char productID[idLen]; 

for(int i = 0; i < 13; i++) { 
    productID[i] = newTag[i]; 
} 

// going into this strcat, putEndpoint correctly = "PUT /api/v1/products/" 

char *putRequestID = strcat(putEndpoint,productID); 

// putEndpoint now = "PUT /api/v1/products/xxxxxxxxxxx" 

char *putRequestEndpoint = strcat(putRequestID,http); 

Теперь, если бы я, чтобы сделать 2-й вызов (который мне нужно будет делать), putEndpoint инициализирует в "PUT /api/v1/products/xxxxxxxxxxx".

EDIT: Есть ли альтернатива strcat(), которая может выполнить эту конкатенацию? Теперь я понимаю, что strcat() предназначен для изменения значений.

+1

У вас есть некоторые неприятные ошибки там ... –

+0

@PaulR заботиться о разработке? –

+0

Почему бы не создать временную переменную, которая просто сохранит значение 'putEndpoint', а затем просто установит' putEndpoint' равным этой переменной темпа? – bpgeck

ответ

0

Я в конечном итоге изменение putEndpoint к постоянным и создали массив буфера и что я затем копируется в putEndpoint. Затем этот массив сбрасывается после каждого запроса.

const char putEndpoint[] = "PUT /api/v1/products/"; 
char http[] = " HTTP/1.1"; 
char productID[idLen]; 

char putRequestBuffer[100]; 
strcpy(putRequestBuffer, putEndpoint); 
strcat(putRequestBuffer, productID); 

char *putRequestEndpoint = strcat(putRequestBuffer,http); 
+0

Как код знает 'char putRequestBuffer [100]' достаточно большой? Лучше использовать _something_ как 'char putRequestBuffer [sizeof putEndpoint + sizeof http + sizeof productID];' – chux

3

Вы можете использовать sprintf.

A simple working example -

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

int main(void) { 

     char putEndpoint[] = "PUT /api/v1/products/"; 
     char http[] = " HTTP/1.1"; 
     char *putRequestEndpoint; 

     putRequestEndpoint=malloc(strlen(putEndpoint)+strlen(http)+1); //allocating memory 

     sprintf(putRequestEndpoint,"%s%s",putEndpoint,http); // formatted output is stored in putRequestEndpoint 
     printf("%s\n",putRequestEndpoint); 
     printf("%s",putEndpoint); // will print original string unchanged. 
     free(putRequestEndpoint); //freeing memory 
     return 0; 
    } 
0

memcpy и статические массивы с фиксированным размером и надлежащей проверки границ ваш друг, мой друг.

0

Вам нужно будет сбросить его с помощью кода. Если изменить putEndpoint[] к константным, что сделает ваш первый линия выглядеть

const char putEndpoint[] = "PUT /api/v1/products/"; 

компилятор выдаст сообщение об ошибке в первый раз, когда вы strcat(putEndpoint,...), потому что strcat будет пытаться записать на постоянной переменной. Это заставит вас найти альтернативное решение.

Приведенный ниже код явно выделяет временную память для строки конечной точки по мере необходимости, копирует в нее первую строку, объединяет в нее следующие две части, использует ее и, наконец, де-распределяет и возвращает указатель обратно в NULL.

int lengthEndpoint = 0; 
char* putRequestEndpoint = NULL; 

lengthEndpoint = strlen(putEndpoint) + strlen(productID) + strlen(http); 
lengthEndpoint += 1; // add room for null terminator 

putRequestEndpoint = malloc(lengthEndpoint); 
strcpy(putRequestEndpoint, putEndpoint); 
strcat(putRequestEndpoint, productID); 
strcat(putRequestEndpoint, http); 

// do something with putRequestEndpoint 

free(putRequestEndpoint); 
putRequestEndpoint = NULL; 

Перед тем как ответить на это, я освежил мою память C манипуляций со строками, используя эту WIKIBOOKS site. Я бы рекомендовал его для дальнейшего чтения по этому вопросу.