我虽然说,如果我cast有一个像这样的数字(unsigned char)32,就足以解决编译器的警告,但这并不是我的计划。
在这里,我有程序的以下部分,实际上解释了这个问题:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void){
char *ptr = malloc(6);
const char *name = "MICHI";
unsigned int i = 0;
if(ptr){
strcpy(ptr, name);
ptr[strlen(ptr)] = '\0';
}else{
return 1;
}
while(ptr[i] != '\0'){
if((ptr[i] >= 'A') && (ptr[i] <= 'Z')){
ptr[i] += (unsigned char)32;
}
i++;
}
printf("Name = %s\n",ptr);
if(ptr){
free(ptr);
ptr = NULL;
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在打开编译器警告的情况下对其进行编译时,得到以下信息:
error: conversion to ‘char’ from ‘int’ may alter its value [-Werror=conversion]|
Run Code Online (Sandbox Code Playgroud)
这意味着以下内容ptr[i] += (unsigned char)32;无法解决我的问题。
我的问题是,如何删除此警告,因为我对此一无所知。
Ideone没有太大帮助,因为我认为所有警告都已关闭。
OP使用的警告级别非常挑剔
警告:从“ int”转换为“ char”可能会更改其值[-Wconversion]
// Both cause the warning
ptr[i] += (unsigned char) 32;
ptr[i] = tolower(ptr[i]);
Run Code Online (Sandbox Code Playgroud)
要解决该警告,请明确
ptr[i] = (char) (ptr[i] + 32);
ptr[i] = (char) tolower(ptr[i]);
Run Code Online (Sandbox Code Playgroud)
[详细信息]涉及窄类型like的char, short, unsigned char, _Bool, ...运算将使用通常的整数提升为int/unsignedlike 来提升该操作数ptr[i]。因此,将其分配int/unsigned回char触发器将触发警告。明确显示结果将使警告消失。
许多编译都忽略了该[-Wconversion] or equivalent选项,因此不会看到警告。
| 归档时间: |
|
| 查看次数: |
5395 次 |
| 最近记录: |