将Char与==和单引号进行比较会给出警告

将Char与==和单引号进行比较会给出警告,c,char,comparison,single-quotes,C,Char,Comparison,Single Quotes,我正在编写一个计算余弦的程序,我应该读取用户输入的角度,以度(°)或弧度(r)为单位。如果角度以度为单位,则应将其转换为弧度(因此我使用If-else语句)。但是,当我将char与==和单引号进行比较时,我得到以下警告: warning: multi-character character constant [-Wmultichar] if((unit != '°') && (unit != 'r')) 这是我的完整代码: #include<stdio.h> #in

我正在编写一个计算余弦的程序,我应该读取用户输入的角度,以度(°)或弧度(r)为单位。如果角度以度为单位,则应将其转换为弧度(因此我使用If-else语句)。但是,当我将char与
==
和单引号进行比较时,我得到以下警告:

warning: multi-character character constant [-Wmultichar]
if((unit != '°') && (unit != 'r'))
这是我的完整代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

// Prototype
void calc_cos(double, char);

int main (void)
{
    double angle;
    char unit;
    printf("PLease give an angle and its unit in degrees (°) or radians (r) for cosinus calculation\n");
    if((unit != '°') && (unit != 'r'))
    {
        printf("ERROR. Unit is not in '°' or 'r'. Aborting...\n");
        return 0;
    }
    else
    {
    scanf("%lf %c", &angle, &unit);
    calc_cos(angle, unit);
    }
    return 0;
}

void calc_cos(double angle, char unit)
{
    double results=0;
    if(unit == '°')
    {
        angle = angle*M_PI/180;
    }
    else if(unit == 'r')
    {
        angle = angle;
    }
    results = cos(angle);
    printf("cos(%lf rad) = %lf\n", angle, results);
}
#包括
#包括
#包括
//原型
无效计算成本(双精度,字符);
内部主(空)
{
双角度;
炭单元;
printf(“请给出一个角度及其单位,以度(°)或弧度(r)表示余弦计算\n”);
如果((单位!='°)&&(单位!='r'))
{
printf(“错误。单位不在“°”或“r”中。正在中止…\n”);
返回0;
}
其他的
{
扫描频率(“%lf%c”、&角度和单位);
计算成本(角度,单位);
}
返回0;
}
无效计算单位(双角度,字符单位)
{
双结果=0;
如果(单位=“”“”)
{
角度=角度*M_PI/180;
}
否则如果(单位='r')
{
角度=角度;
}
结果=cos(角度);
printf(“cos(%lf rad)=%lf\n”、角度、结果);
}

在C中,字符是一个字节,但度符号通常需要多个字节,至少在UTF-8字符编码中是这样。一种解决方案是将单元存储在字符数组中,如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char unit[4 + 1];
    int count;

    count = scanf("%4s", unit);
    if (count == 1) {
        if (strcmp(unit, "°") == 0) {
            puts("degrees chosen");
        } else if (strcmp(unit, "r") == 0) {
            puts("radians chosen");
        } else {
            fprintf(stderr, "invalid unit: %s\n", unit);
            exit(EXIT_FAILURE);
        }
    }
    return 0;
}
#包括
#包括
#包括
内部主(空)
{
字符单位[4+1];
整数计数;
计数=扫描频率(“%4s”,单位);
如果(计数=1){
if(strcmp(单位“”)==0){
看跌期权(“所选学位”);
}否则如果(strcmp(单位,“r”)==0){
放置(“所选弧度”);
}否则{
fprintf(标准,“无效单位:%s\n”,单位);
退出(退出失败);
}
}
返回0;
}
UTF-8字符的长度为一到四个字节,格式说明符
%4s
确保最多读取四个字节


但是,更简单的方法是使用字母“d”表示度。

正如其他人在注释中所指出的,度(
°
)字符在ASCII系统中不编码为单个字节;相反,编译器将其解释为(可能)两个字节的序列

围绕这一点有多种方法。一种方法是使用
wchar\u t
类型作为
单位
变量,并使用相应的宽文本进行比较(
L'''
L'r'
,代替
''''''
'r'
);但是,这需要(至少)更改
scanf
调用以使用
%lc
格式说明符,但在这种情况下,使用标准I/O函数的
wprintf
wscanf
宽字符版本几乎肯定会更好

但是,即使进行了这些更改,在控制台应用程序中读取
°
字符也可能会遇到问题,因为可以使用许多不同的编码系统。因此,在我看来,最好使用一个简单的字母
d
来指定度的单位

此外,即使有这些修复,代码中也存在一些其他问题。最值得注意的是,在给出
单元之前,您正在测试
变量。已更正的代码,加上一些其他建议的改进(并使用d表示度数),如下所示:

#包括
#包括
#define _USE_MATH _define///许多编译器需要它来给出“M_PI”定义
#包括
//原型
无效计算成本(双精度,字符);
内部主(空)
{
双角度;
炭单元;
printf(“请为余弦计算提供角度及其单位,单位为度(d)或弧度(r”);
scanf(“%lf%c”、&angle和&unit);///测试前必须读取“unit”!
如果((单位=d')&(单位=r')){
printf(“错误。单位不在'd'或'r'中。正在中止…\n”);
返回0;
}
计算成本(角度,单位);
返回0;
}
无效计算单位(双角度,字符单位)
{
双结果=0;
如果(单位='d'){
角度=角度*M_PI/180;
}
//如果(unit='r'){///这个块是不必要的
//角度=角度;
//  }
结果=cos(角度);
printf(“cos(%lf rad)=%lf\n”、角度、结果);
}

请随时询问任何进一步的澄清和/或解释。

正如警告(多字符字符)所告诉您的,
“°”
不是
char
类型。C数据类型是在UTF-8和Unicode之前发明的。将
char
视为“byte”的同义词。对于不在一个字节中表示的字符(如:在UTF-8模式下),不能将其存储在
char
中。您可以使用宽字符类型和实现定义的类型,或者设计自己处理Unicode的方法(例如,使用
uint32\u t
将Unicode代码点存储为UCS-4)。@goodvibration:在C中,没有字符常量是
char
类型。它们都是
int