字符和字符串与C.

时间:2015-08-05 20:51:09

标签: c string char type-conversion

我正在研究用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 ...

我该怎么办?

谢谢大家!

2 个答案:

答案 0 :(得分:3)

这不会按照你期望的方式运作:

scanf("%s", &m);

munsigned 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);