我的c程序代码有问题请帮我解决问题

时间:2021-05-15 05:10:59

标签: c

为什么我在使用 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 *

1 个答案:

答案 0 :(得分:0)

正如消息所说,变量 fb 的类型为 char,它在可变数字参数中被提升为 int。您必须在 char* 中为 %s 传递 scanf()

%s读取字符串(字符序列以空字符结束),因此将指针传递给{{ 1}} 是错误的,会导致危险的超出范围的访问。

您应该为字符串分配一个数组并传递指向其元素的指针。您还应该设置要读取的最大字符数以避免缓冲区溢出。考虑到终止空字符,限制应该是(最多)缓冲区中元素的数量减一。

要改变的事情:

%s

它们应该是:

    char fb='y';
        scanf("%s",fb);
    }while(fb=='y' || fb=='Y');