【问题标题】:Characters and Strings with CC 中的字符和字符串
【发布时间】:2015-10-28 19:45:20
【问题描述】:

我正在开发用 C 编写的 RESTful 客户端。这很简单,我只需要邮寄一个我在终端上写的人名(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...

我该怎么做?

谢谢大家!

【问题讨论】:

  • m 是单个字符。您需要一个 char 数组。
  • 连接使用strcatstrncat

标签: c string char type-conversion


【解决方案1】:

这不会像你期望的那样工作:

scanf("%s", &m);

munsigned char,scanf %s 修饰符将尝试读取字符串,将其写入您提供给它的指针,然后以空值终止它。对于任何非空名称,它将写入无效内存(如果幸运的话,这应该会崩溃)。

确实,您传递了一个指向字符的指针,但只有 1 个字符的空间。

你应该使用数组来代替,例如:

char m[512];
/* ... */
scanf("%s", m);

请注意,这会将名称长度的上限设为 511。如果您希望名称更长,请增加缓冲区大小。

更新

您可以通过以下方式添加 URL:

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。

【讨论】:

  • 对.. 并将这个变量与我的 URL "localhost/wsRest/index.php/novo/" + m 我该怎么做?
  • 优先使用fgets(&amp;m[idx], sizeof m - idx - 1, stdin); 而不是scanf,以防止恶意输入导致缓冲区溢出。
【解决方案2】:

首先,您需要一个数组来保存用户输入的名称。改变这个

unsigned char m;

到这里

char m[1000];

接下来,你需要一个数组来保存 URL

char url[1200];

然后您可以使用sprintf 将名称附加到 URL

sprintf( url, "localhost/wsRest/index.php/novo/%s", m ); 

最后将url 传递给setopt 函数

curl_easy_setopt(curl, CURLOPT_URL, url);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多