gpt4 book ai didi

c - 动态选择引用哪个#define

转载 作者:太空宇宙 更新时间:2023-11-04 06:46:11 26 4
gpt4 key购买 nike

我正在编写一个 HTTP 1.0 下载程序并使用这些 #define 替换来格式化查询:

#define GET_FORMAT "GET %s%s HTTP/1.0\r\nHost: %s\r\nUser-Agent: getter\r\n\r\n"
#define HEAD_FORMAT "HEAD %s%s HTTP/1.0\r\nHost: %s\r\nUser-Agent: getter\r\n\r\n"
#define GET_FORMAT_RANGE "GET %s%s HTTP/1.0\r\nHost: %s\r\nRange: %s\r\nUser-Agent: getter\r\n\r\n"
#define HEAD_FORMAT_RANGE "HEAD %s%s HTTP/1.0\r\nHost: %s\r\nRange: %s\r\nUser-Agent: getter\r\n\r\n"

我目前正在使用类似的东西来替换查询字符串的“%s”部分。我觉得它可以更优雅:

char* query_string_formatter(char* page, char* host, int get){ 
switch(get) {
case 0:
//HEAD
{
char* query = malloc(strlen(host) + strlen(page) + 1 + HEAD_FORMAT_LEN);
if (page[0] == '/') {
sprintf(query,HEAD_FORMAT, "", page, host);
} else {
sprintf(query, HEAD_FORMAT, "/", page, host);
}
return query;
}
default:
//GET
{
char* query = malloc(strlen(host) + strlen(page) + 1 + GET_FORMAT_LEN);
if (page[0] == '/') {
sprintf(query,GET_FORMAT, "", page, host);
} else {
sprintf(query, GET_FORMAT, "/", page, host);
}
return query;
}
}

}

但我喜欢用像这样更优雅的东西来代替它:

...

sprintf(query, format, "",page,host);

其中格式要么是 GET 要么是 HEAD,而不是有多个嵌套的 if 语句和重复的代码

最佳答案

为了防止代码重复,你可以使用一个变量来记住之前的格式

char* query_string_formatter(char* page, char* host, int get){
char* query = malloc(strlen(host) + strlen(page) + 1 + HEAD_FORMAT_LEN);
char *format;
if (get)
format = GET_FORMAT;
else
format = HEAD_FORMAT;
if (page[0] == '/')
sprintf(query, format, "", page, host);
else
sprintf(query, format, "/", page, host);
return query;
}

或更短但可读性较差:

char* query_string_formatter(char* page, char* host, int get){
char* query = malloc(strlen(host) + strlen(page) + 1 + HEAD_FORMAT_LEN);
sprintf(query, get ? GET_FORMAT : HEAD_FORMAT, page[0] == '/' ? "" : "/", page, host);
return query;
}

此外:确保 HEAD_FORMAT_LEN 包含 '\0' 结尾,或者在 malloc 中添加更多的 1。

关于c - 动态选择引用哪个#define,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57831942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com