为什么我在使用 GCC 进行编译时会出错,即使我已将 ch
变量设置为 char
类型?
我的程序:
#include <stdio.h>
void circular(int*,int*,int*);
int main(){
int n1,n2,n3,flag=1;
char fb='y';
do{
printf("enter the value of x,y,z resp.: ");
scanf("%d%d%d",&n1,&n2,&n3);
circular(&n1,&n2,&n3);
printf("after %d circular shift values are: \nx= %d\ny= %d\nz= %d\nwant to do circular shift again(y/n): ",flag,n1,n2,n3);
scanf("%s",fb);
flag+=1;
}while(fb=='y' || fb=='Y');
return 0;
}
void circular(int *n1,int *n2,int *n3){
int temp;
temp=*n1;
*n1=*n2;
*n2=*n3;
*n3=temp;
}
gcc 编译后报错:
c4q13.c: In function ‘main’:
c4q13.c:22:11: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
22 | scanf("%s",fb);
| ~^ ~~
| | |
| | int
| char *
答案 0 :(得分:0)
正如消息所说,变量 fb
的类型为 char
,它在可变数字参数中被提升为 int
。您必须在 char*
中为 %s
传递 scanf()
。
也%s
读取字符串(字符序列以空字符结束),因此将指针传递给{{ 1}} 是错误的,会导致危险的超出范围的访问。
您应该为字符串分配一个数组并传递指向其元素的指针。您还应该设置要读取的最大字符数以避免缓冲区溢出。考虑到终止空字符,限制应该是(最多)缓冲区中元素的数量减一。
要改变的事情:
%s
它们应该是:
char fb='y';
scanf("%s",fb);
}while(fb=='y' || fb=='Y');