将 Char 与 == 和单引号进行比较会发出警告
Comparing Char with == and single quote gives warning
我正在编写一个计算余弦的程序,我应该读取以度 (°) 或弧度 (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);
}
在 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;
}
UTF-8 字符的长度为一到四个字节,格式说明符 %4s
确保最多读取四个字节。
但是,更简单的方法是使用字母“d”来表示度数。
正如其他人在评论中指出的那样,度数 (°
) 字符在 ASCII 系统中未编码为单个字节;相反,它被编译器解释为(可能)两个字节的序列。
有多种解决方法。一种方法是为 unit
变量使用 wchar_t
类型,并使用相应的宽文字进行比较(L'°'
和 L'r'
,代替 '°'
和 'r'
);但是,这将需要更改(至少)您的 scanf
调用以使用 %lc
格式说明符,但您几乎肯定会更好,在这种情况下,使用 wprintf
和 wscanf
标准 I/O 函数的“宽字符”版本。
但是,即使进行了此类更改,您也可能会在控制台应用程序中读取 °
字符时遇到问题,因为可以使用许多不同的编码系统。因此,在我看来,您最好使用一个简单的字母 d
来指定度数单位。
此外,即使进行了这些修复,您的代码中仍存在一些其他问题。最值得注意的是,您正在测试 unit
变量 在 之前。更正后的代码,加上一些其他建议的改进(并使用 d
表示度数)如下所示:
#include <stdio.h>
#include <stdlib.h>
#define _USE_MATH_DEFINES /// Many compilers require this to give the "M_PI" definition
#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 (d) or radians (r) for cosinus calculation\n");
scanf("%lf %c", &angle, &unit); /// MUST read "unit" BEFORE testing it!
if ((unit != 'd') && (unit != 'r')) {
printf("ERROR. Unit is not in 'd' or 'r'. Aborting...\n");
return 0;
}
calc_cos(angle, unit);
return 0;
}
void calc_cos(double angle, char unit)
{
double results = 0;
if (unit == 'd') {
angle = angle * M_PI / 180;
}
// else if (unit == 'r') { /// This block is unnecessary
// angle = angle;
// }
results = cos(angle);
printf("cos(%lf rad) = %lf\n", angle, results);
}
如有任何进一步的说明,请随时提出 and/or 解释。
我正在编写一个计算余弦的程序,我应该读取以度 (°) 或弧度 (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);
}
在 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;
}
UTF-8 字符的长度为一到四个字节,格式说明符 %4s
确保最多读取四个字节。
但是,更简单的方法是使用字母“d”来表示度数。
正如其他人在评论中指出的那样,度数 (°
) 字符在 ASCII 系统中未编码为单个字节;相反,它被编译器解释为(可能)两个字节的序列。
有多种解决方法。一种方法是为 unit
变量使用 wchar_t
类型,并使用相应的宽文字进行比较(L'°'
和 L'r'
,代替 '°'
和 'r'
);但是,这将需要更改(至少)您的 scanf
调用以使用 %lc
格式说明符,但您几乎肯定会更好,在这种情况下,使用 wprintf
和 wscanf
标准 I/O 函数的“宽字符”版本。
但是,即使进行了此类更改,您也可能会在控制台应用程序中读取 °
字符时遇到问题,因为可以使用许多不同的编码系统。因此,在我看来,您最好使用一个简单的字母 d
来指定度数单位。
此外,即使进行了这些修复,您的代码中仍存在一些其他问题。最值得注意的是,您正在测试 unit
变量 在 之前。更正后的代码,加上一些其他建议的改进(并使用 d
表示度数)如下所示:
#include <stdio.h>
#include <stdlib.h>
#define _USE_MATH_DEFINES /// Many compilers require this to give the "M_PI" definition
#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 (d) or radians (r) for cosinus calculation\n");
scanf("%lf %c", &angle, &unit); /// MUST read "unit" BEFORE testing it!
if ((unit != 'd') && (unit != 'r')) {
printf("ERROR. Unit is not in 'd' or 'r'. Aborting...\n");
return 0;
}
calc_cos(angle, unit);
return 0;
}
void calc_cos(double angle, char unit)
{
double results = 0;
if (unit == 'd') {
angle = angle * M_PI / 180;
}
// else if (unit == 'r') { /// This block is unnecessary
// angle = angle;
// }
results = cos(angle);
printf("cos(%lf rad) = %lf\n", angle, results);
}
如有任何进一步的说明,请随时提出 and/or 解释。