我正在研究用C语言编写的宁静客户端。这很简单,我只需要通过邮件发送我在终端上写的人名(John,Sam,Muhammad,Whatever ......)。
我的整个代码工作正常,但我有转换字符或字符串的问题,通过邮寄发送。
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
int main(void) {
CURL *curl;
CURLcode res;
int x = 1;
unsigned char m;
while (x != 0) {
printf("Opcao 1 para incluir nova pessoa\n");
printf("Opcao 2 para listar pessoas\n");
printf("Opcao 0 para sair\n");
printf("Selecione a opcao: ");
scanf("%d",&x);
if (x == 1) {
printf("Nome da pessoa: ");
scanf("%s",&m);
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "localhost/wsRest/index.php/novo/" );
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "");
res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
curl_easy_cleanup(curl);
}
}
printf("\n");
}
curl_global_cleanup();
return 0;
}
我需要找到一种方法将名称写在curl_easy_setopt()函数中的变量'm'上,与我的URL连接,但我不知道怎么做,我发现的例子甚至无法读取另一个变量的URL ...
我该怎么办?
谢谢大家!
答案 0 :(得分:3)
这不会按照你期望的方式运作:
scanf("%s", &m);
m
是unsigned char
,scanf %s
修饰符将尝试读取字符串,将其写入您为其提供的指针,并将其终止。对于任何非空名称,它将写入无效的内存(如果你很幸运,这应该崩溃)。
的确,你传递了一个指向角色的指针,但是只有1个角色的空间。
您应该使用数组,例如:
char m[512];
/* ... */
scanf("%s", m);
请注意,这会在名称长度上放置511的上限。如果您希望更长的名称,请增加缓冲区大小。
<强>更新强>:
您可以通过执行以下操作来添加网址:
char m[512];
int idx = sprintf(m, "localhost/wsRest/index.php/novo/");
/* ... */
scanf("%s", &m[idx]);
然后将m
作为网址传递。
首先将URL路径存储在m
中,然后将输入字符串读入缓冲区的其余部分。 sprintf(3)
返回写入的字符数,因此idx
是URL路径后第一个位置的偏移量。
如果您想要追加,请scanf("%s", m)
,然后使用strcat(m, "localhost/wsRest/index.php/novo/")
。
同样,这假设名称+ URL大小小于511。
答案 1 :(得分:1)
首先,您需要一个数组来保存用户输入的名称。改变这个
unsigned char m;
到这个
char m[1000];
接下来,您需要一个数组来保存URL
char url[1200];
然后,您可以使用sprintf
将名称附加到网址
sprintf( url, "localhost/wsRest/index.php/novo/%s", m );
最后将url
传递给setopt
函数
curl_easy_setopt(curl, CURLOPT_URL, url);