C 使用va_arg转换字符

C 使用va_arg转换字符,c,C,我需要从va_arg那里得到一个字符。 我使用整数,但我的问题是它不起作用 char c = (char)va_arg(ap, int); write(1, &c, 1); 它给出了其他东西的ascii码。变量函数的参数(与声明中的…相对应的参数)接受默认参数升级 小于int的整数参数升级为int(如果类型为无符号且其最大值超过int\u MAX,则升级为unsigned int),而float类型的参数升级为double 因此,您无法从va_arg()获取char。显而易见的 cha

我需要从va_arg那里得到一个字符。 我使用整数,但我的问题是它不起作用

char c = (char)va_arg(ap, int);
write(1, &c, 1);

它给出了其他东西的ascii码。

变量函数的参数(与声明中的
相对应的参数)接受默认参数升级

小于
int
的整数参数升级为
int
(如果类型为无符号且其最大值超过
int\u MAX
,则升级为
unsigned int
),而
float
类型的参数升级为
double

因此,您无法从
va_arg()
获取
char
。显而易见的

char c = va_arg(ap, char); // DON'T DO THIS
具有未定义的行为

你在做什么:

char c = (char)va_arg(ap, int);
看起来是正确的,不过不需要强制转换
(char)
;无论如何,
int
结果将隐式转换为
char

例如,此程序的输出是
c='x'

#include <stdio.h>
#include <stdarg.h>

void func(int first, ...) {
    va_list ap;
    va_start(ap, first);
    char c = va_arg(ap, int);
    va_end(ap);
    printf("c = '%c'\n", c);
}

int main(void) {
    func(42, 'x');
}
#包括
#包括
void func(先整型,…){
va_列表ap;
va_启动(ap,第一);
字符c=va_arg(ap,int);
va_端(ap);
printf(“c='%c'\n',c);
}
内部主(空){
func(42,'x');
}

你需要更新你的问题来描述实际的问题是什么。你说“它给出了其他东西的ascii码”;我不知道这是什么意思。

char c=va_arg(ap,char)?@willl:不,这有未定义的行为。很简洁的“默认参数提升”解释,我想你可以删除“is unsigned and its”。@chux:也许吧,但我想强调的是,只有当窄整数类型是unsigned时,它才能提升为
int
。对于任何窄符号类型,其最大值都不能超过
INT\u MAX
。IAC,我仍然喜欢解释的简短(并试图挤出更多的字。)OTOH:虽然害羞50,但祝贺100k@楚克斯:哦,太好了,现在你已经倒霉了!8-}我现在是10万以下人群中的佼佼者。我即将成为10多万人中的最底层。