关于 'string' 和 'int' 之间转换的奇怪警告

Strange warning about conversion between 'string' and 'int'

我顺便用了CLion。

int ch;
printf("Insert the operation you want to execute: ");
scanf("%d", &ch); //HERE

我将 ch 声明为整数变量并使用 scanf%d 我希望用户插入一个值以插入ch 变量,但此处会弹出一条警告并显示:" 'scanf' used to convert a string to an integer value"

我不明白为什么...

这是完整的代码,如评论中所要求的: (代码修改了,因为我从昨天开始改了)

typedef unsigned int boolean;

struct list{
float * buffer;
int size;
int head;
int tail;
};

int getsize();
float getvalue();
void init(struct list*, int);
boolean suf_insert(struct list*, float, int);
boolean pre_insert(struct list*, float, int);
void visit(struct list*);

int main(){

struct list listA;
struct list listB;
int size=0;

int ch;

while(1){

    printf("Sequential Lists operations\n");
    printf("1.  Insert the size of the array\n");
    printf("2.  Initialize the list A\n");
    printf("3.  Initialize the list B\n");
    printf("4.  \n");
    printf("5.  \n");
    printf("6.  \n");
    printf("7.  \n");

    printf("\nInsert the operation you want to execute: ");
    scanf("%d", &ch);
    switch(ch){
        case 1: size=getsize();
            break;
        case 2: init(&listA, size);
            break;
        case 3: init(&listB, size);
            break;
        case 4: getvalue();
            break;
        case 5:
            break;
        case 6:
            break;
        case 7:
            break;

        default: printf("\nInvalid command. Retry\n");
            break;
    }
}

}
int getsize(){
int size;
printf("Insert the size of the list you want to create: ");
scanf("%d", &size);
return size;
}

float getvalue(){
float value;
printf("The value you want to insert: ");
scanf("%f", &value);

return value;
}

void init(struct list * ptr, int size) {

if (size != 0) {
    ptr->buffer = (float *) malloc(size * sizeof(int));
    ptr->size = size;
    ptr->head = 0;
    ptr->tail = 0;
} else {
    printf("\nBefore continue, insert the size.\n");
}
}

boolean suf_insert(struct list * ptr, float value, int size){

    if(((ptr->tail + 1) % ptr->size) != ptr->head && size!=0) {

        ptr->buffer[ptr->tail] = value;
        ptr->tail = (ptr->tail + 1) % ptr->size;

        return TRUE;
    } else {

        return FALSE;
    }
}

boolean pre_insert(struct list * ptr, float value, int size){

if(((ptr->tail + 1) % ptr->size) != ptr->head && size!=0){

        ptr->head = (ptr->head + ptr->size - 1) % ptr->size;
        ptr->buffer[ptr->head] = value;

        return TRUE;
}else{

        return FALSE;
}
}

void visit(struct list * ptr){

int position;
for(position=ptr->head; position!=ptr->tail; position=(position+1)%ptr-     >size){
    printf("%f", ptr->buffer[position]);
}

}

看来我必须重复一遍:这段代码并不完美,也许恰恰相反!我还在努力!

警告清楚说明原因;您省略了“函数不会报告转换错误”的部分。然而,这显然也是无稽之谈:strtol() 也不报告转换错误 - 如果存在转换错误,它只是 return 为零 - 但这与成功转换“0”没有区别。

对于 scanf() 至少 return 值是成功或其他方面的明确指示。确实 scanf() 不报告转换错误,它报告成功转换的计数,因此当只有一次转换时,如本例, return 值为零恰好报告转换错误.

“警告”是由您的 IDE 而不是您的编译器生成的,它只是建议(IMO 的错误建议)- 您可以明确地选择忽略该建议。

但是您至少应该检查 来自scanf() 的return 值。如果 scanf() 失败,则 ch 的值未定义。 strtol() 的一个优点是在失败时它 return 至少是一个定义的值 - 零 - 至少在这种 具体 情况下,零是无效值,所以它有优点;但也许不是因为警告中建议的原因。