0

我刚开始学习C,我想创建一个基于文本的小型浏览器。当程序启动时,它会显示“输入 URL:”,然后我使用scanf(), 来获取用户的输入。当它抓住它时,它应该说“正在加载 {USER_INPUT}...”,但它却说“正在加载 {FIRST_LETTER_OF_USERS_INPUT}...”,在这种情况下它是h. 我确信声明变量有问题。这是我的完整代码:

#include <stdio.h>
#include <curl/curl.h>
 
int main(void)
{

char urlinput;
CURL *curl;
CURLcode res;

curl = curl_easy_init();
if(curl) {
    printf("\nEnter a URL to go to: ");
    scanf("%c", &urlinput);
    printf("\nLoading %c...\n", urlinput);

    curl_easy_setopt(curl, CURLOPT_URL, urlinput);
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
    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);
}
return 0;
}
4

2 回答 2

0

这里的问题是 urlinput 不应该是 char,而是 char* 或 char 数组。此外,您应该使用“%s”格式调用scanf,它读取一个字符串,而不是一个读取单个字符的“%c”。

无论如何,这个问题与 CURL 无关。

这是一个更简单、更正确的示例:

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

int main()
{
    char input[1024];

    printf("Enter a URL to go to: ");
    scanf("%1023[^\n]", input);
    //Or: scanf("%1023s", input);
    printf("Loading %s...\n", input);

    return 0;
}

“s”和“[^\n]”格式的区别在于“s”在第一个空格处停止,而“[^\n]”读取整行。由于 URL 语法禁止空格,因此在您的情况下没有区别。

我说的正确,因为我发布的代码仍然存在缺陷:它缺乏错误检查并且不处理输入长度超过 1024 个字符的情况(它不会崩溃,这要归功于我在格式中指定的 1023 宽度,但会默默地丢弃超过 1023 的字符,这不太礼貌)。

有关详细信息,请参阅 C 标准或您正在使用的 C 库的手册。这里是GNU C,这里是微软

于 2013-09-16T00:19:04.557 回答
0

您需要使用一个字符数组(字符串):

char urlinput[100];

和你的scanf:

scanf("%s", urlinput);
于 2013-09-16T00:07:54.847 回答