如何删除警告“从'int'转换为'char'可能会改变其值”

时间:2016-02-16 17:50:22

标签: c casting

我虽然如果我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;
    }
}

当我尝试使用编译器警告ON编译它时,我得到了这个:

error: conversion to ‘char’ from ‘int’ may alter its value [-Werror=conversion]|

这意味着以下ptr[i] += (unsigned char)32;无法解决我的问题。

我的问题是,如何放弃此警告,因为我对此一无所知。

Ideone没有多大帮助,因为我认为所有警告都已关闭。

4 个答案:

答案 0 :(得分:4)

OP正在使用非常挑剔的警告级别

  

警告:转换为&#39; char&#39;来自&#39; int&#39;可能会改变其值[-Wconversion]

  ptr[i] = (char) (ptr[i] + 32);
  ptr[i] = (char) tolower(ptr[i]);

要解决警告,请明确

char, short, unsigned char, _Bool, ...

[详细信息]涉及像int/unsigned这样的窄类型的操作将使用通常的整数促销升级到ptr[i],例如int/unsigned。因此,将char分配回[-Wconversion] or equivalent会触发警告。结果的显式转换会使警告静默。

许多编辑省略了systemname, percentage, status, type Server1,75,0,v Server2,75,0,v Server3,50,0,v Server4,5,0,v 选项,因此不会看到警告。

答案 1 :(得分:2)

添加到评论中, 实际上只是一种使用强化转换来消除警告的方法:

ptr[i] = (char)((int)ptr[i]  + 32);

这样,转换处理被委托给赋值运算符,该运算符在Standard, 6.5.16.1p3中定义(由@Olaf指定)。

答案 2 :(得分:1)

这一行:

ptr[i] = ptr[i] + 32;

真的意味着:

ptr[i]

现在...... char可能合法地大到255.如果你加了255 + 32,你就得到287。

您如何建议在char内拟合值287,其最大值为255?
 你不能这样做。这就是错误所在。

如果你想摆脱这个错误,你必须首先清楚地了解当添加可能会创建大于tolower的值时,你想要发生什么。

如果您只是想将字母 AZ 转换为小写字母,只需使用 相应的 api:{{3 }}

如果您真的不打算使用ptr[i] = (unsigned char)(ptr[i] + 32); ,请尝试以下操作:

*.keystore binary

重要区别在于,类型转换是在计算的 结果 上,而不是在 操作数 的操作。

答案 3 :(得分:0)

警告是因为您可能会超出char值的边界。

通常,避免警告通常不是一个好主意。

使用tolower()以更清洁的方式完成工作。