传递参数 1 从指针生成整数,没有对 putchar 的转换警告
Passing Argument 1 makes integer from pointer without a cast warning for putchar
我正在研究制作一个简单代码的练习,该代码的功能与使用 可变函数.
的 printf 的功能相同
此外,我希望使用 sprintf 和 putchar,而不是 printf。
代码似乎可以正常运行并给出应有的结果(即为 %c 打印一个字符,为 %d 打印一个整数)。
但是,我不断收到 putchar(cStr);
的警告消息,上面写着 Passing Argument 1 of 'putchar' makes integer from pointer without a cast
。
另外,我收到一个 note 上面写着 expected int but argument is of type char *
.
我试图通过将 putchar(cStr);
更改为 putchar(*cStr);
来解决这个问题,但随后代码给了我一个 segment fault
.
如何解决警告信息和注意事项?
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
void new_printf(const char*format, ...);
int main(void)
{
new_printf("A single character : %c An integer : %d \n", 'T', 37);
return 0;
}
void new_printf(const char *format, ...)
{
va_list ap;
char ary[50];
char *cStr;
int iNum, i=0;
va_start(ap, format);
while(*format)
{
if(strncmp(format, "%d",2) == 0){
iNum = va_arg(ap, int);
sprintf(ary, "%d", iNum);
while(ary[i]!='[=10=]'){
putchar(ary[i]);
i++;
}
format = format + 2;
}
else if(strncmp(format, "%c", 2)==0)
{
cStr = va_arg(ap, char*);
putchar(cStr);
format = format + 2;
}
else{
putchar(*format);
format++;
}
}
va_end(ap);
}
正确的结果如下:
A single character : T An integer : 37
在调用 new_printf("A single character : %c An integer : %d \n", 'T', 37);
中,'T'
被传递给 %c
转换。 'T'
是一个字符:是一个小整数值。它不是指针。由于历史原因,它的类型是int
。这是为 %c
.
传递的正确内容
在 else if(strncmp(format, "%c", 2)==0)
下,在 cStr = va_arg(ap, char*);
中,你告诉 va_arg
给你下一个参数,那个参数是 char *
。它不是。这是一个 int
.
您应该使用 va_arg
检索它作为 int
并将其分配给 int
,而不是 char *
,或者直接将其用作 int
.
您应该使用 int x = va_arg(ap, int); putchar(x);
或简单地使用 putchar(va_arg(ap, int));
。
我正在研究制作一个简单代码的练习,该代码的功能与使用 可变函数.
的 printf 的功能相同此外,我希望使用 sprintf 和 putchar,而不是 printf。
代码似乎可以正常运行并给出应有的结果(即为 %c 打印一个字符,为 %d 打印一个整数)。
但是,我不断收到 putchar(cStr);
的警告消息,上面写着 Passing Argument 1 of 'putchar' makes integer from pointer without a cast
。
另外,我收到一个 note 上面写着 expected int but argument is of type char *
.
我试图通过将 putchar(cStr);
更改为 putchar(*cStr);
来解决这个问题,但随后代码给了我一个 segment fault
.
如何解决警告信息和注意事项?
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
void new_printf(const char*format, ...);
int main(void)
{
new_printf("A single character : %c An integer : %d \n", 'T', 37);
return 0;
}
void new_printf(const char *format, ...)
{
va_list ap;
char ary[50];
char *cStr;
int iNum, i=0;
va_start(ap, format);
while(*format)
{
if(strncmp(format, "%d",2) == 0){
iNum = va_arg(ap, int);
sprintf(ary, "%d", iNum);
while(ary[i]!='[=10=]'){
putchar(ary[i]);
i++;
}
format = format + 2;
}
else if(strncmp(format, "%c", 2)==0)
{
cStr = va_arg(ap, char*);
putchar(cStr);
format = format + 2;
}
else{
putchar(*format);
format++;
}
}
va_end(ap);
}
正确的结果如下:
A single character : T An integer : 37
在调用 new_printf("A single character : %c An integer : %d \n", 'T', 37);
中,'T'
被传递给 %c
转换。 'T'
是一个字符:是一个小整数值。它不是指针。由于历史原因,它的类型是int
。这是为 %c
.
在 else if(strncmp(format, "%c", 2)==0)
下,在 cStr = va_arg(ap, char*);
中,你告诉 va_arg
给你下一个参数,那个参数是 char *
。它不是。这是一个 int
.
您应该使用 va_arg
检索它作为 int
并将其分配给 int
,而不是 char *
,或者直接将其用作 int
.
您应该使用 int x = va_arg(ap, int); putchar(x);
或简单地使用 putchar(va_arg(ap, int));
。