我写了一个用CURL调用web服务的C程序。我通过使用以下参数对webservice的地址进行硬编码来开始我的测试: http://....php?type=adresse&texte=XYZ
它工作正常,所以我试图连接一个变量for field texte如下所示,但它失败并返回400 Bad Request。
我们检查了请求的内容,并且在网络服务地址前面有一个关键字“on”,我不知道它来自哪里。
http://....php?type=adresse&texte=xyz&indDebut=0&indFin=1&epsg=900913&format=json“
char* mystrcat( char* dest, char* src )
{
while (*dest) dest++;
while (*dest++ = *src++);
return --dest;
}
recherche = "G0A3B0";
pcbak_adresse(recherche);
const char * pcbak_adresse(const char *details)
{
...
char * lien;
const char * fin_lien;
lien = "http://....php?type=adresse&texte=";
fin_lien = "&indDebut=0&indFin=1&epsg=900913&format=json";
/*Concatenation function*/
mystrcat(details, fin_lien);
mystrcat(lien, details);
/* Set CURL parameters */
curl_easy_setopt(curlHandler, CURLOPT_URL, lien);
curl_easy_setopt(curlHandler, CURLOPT_CUSTOMREQUEST, "GET");
curl_easy_setopt(curlHandler, CURLOPT_WRITEFUNCTION, callback_func);
curl_easy_setopt(curlHandler, CURLOPT_WRITEDATA, &str);
res = curl_easy_perform(curlHandler);
/* Check for errors */
if (res != CURLE_OK)
return curl_easy_strerror(res);
...
}
感谢您的帮助!
答案 0 :(得分:1)
无论mystrcat()
是什么,
mystrcat(lien, details);
错了。
如果它创建一个由两个输入组成的新字符串,则不会在任何地方捕获它。
如果尝试写入lien
,则表示未定义的行为。因为您无法修改lien
所在的字符串文字。
同样的推理可能适用于details
,但您没有发布details
声明和/或定义。
请勿使用strcat()
之类的内容,除非您只想执行一次。
要连接字符串,请使用类似于存储当前字符串长度,目标数组大小以及目标数组的结构。然后,您可以在需要时调整目标的大小,您不需要每次都找到目标字符串的结尾( strcat()
将执行的操作),您还可以控制如何附加到具有大量细节的字符串的优点。
要实现您想要的目标,您可以这样做
char lien[256];
int length;
length = snprintf(
lien,
sizeof(lien),
"http://....php?type=adresse&texte=%s&indDebut=0&indFin=1&epsg=900913&format=json",
details
);
if ((length >= sizeof(lien)) || (length == -1))
return error_occurred_here();
另外,返回一个静态字符串(可能是curl_easy_strerror()
返回),以及来自同一函数的暂时动态字符串是糟糕的设计,因为,
free()
生成的字符串。