C 使用va_arg转换字符
我需要从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
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多万人中的最底层。