关于 '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 至少是一个定义的值 - 零 - 至少在这种 具体 情况下,零是无效值,所以它有优点;但也许不是因为警告中建议的原因。
我顺便用了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 至少是一个定义的值 - 零 - 至少在这种 具体 情况下,零是无效值,所以它有优点;但也许不是因为警告中建议的原因。