mur*_*cho 2 c integer casting c-strings char
我正在编写可用于生产的 C 语言,我需要快速找到字符数组中字符的频率。我试图删除断言调用以在强制转换期间检查正值。我的断言是多余的代码还是有必要?
char input[] = "Hello World";
int inputLength = sizeof(input)/ sizeof(char);
int *frequencies = calloc(256, sizeof(int));
for(int i = 0; i < inputLength-1; i++)
{
int value = (int) input[i];
assert(value > -1);//Is this line redundant?
frequencies[value] += 1;
}
printf("(%d)", inputLength);
PrintFrequencies(frequencies);
free(frequencies);
Run Code Online (Sandbox Code Playgroud)
在 C 中从 Char 到 Int 的转换总是给出正值
一般来说,没有。 char可以是有符号类型也可以是无符号类型,由 C 实现自行决定,但通常它是有符号类型。
表示基本执行字符集成员的所有char值都保证为非负数。这包括大写和小写拉丁字母、十进制数字、各种标点符号、空格字符和一些控制字符。然而,代表其他字符的值char可能是负数。char此外,构成多字节字符表示的多个值可以包括一些被视为单独的char负值。
我正在编写可用于生产的 C 语言,我需要快速找到字符数组中字符的频率。我试图删除断言调用以在强制转换期间检查正值。我的断言是多余的代码还是有必要?
你的assert()在语义上是错误的。如果您正在阅读任意文本并且希望您的程序健壮,那么您确实需要为chars 具有负值做好准备。但
assert离子是这项工作的错误工具。断言用于检查程序假设的不变量实际上是否成立。例如,如果您(认为您)保证char值始终为非负,则可以使用断言。如果断言失败,则意味着您的代码是错误的。
您绝不能使用断言来验证输入数据或执行程序依赖于执行的任何其他测试,因为根据您编译程序的方式,断言表达式可能根本不会被计算。
如果您的程序遇到负值,最好对其进行处理char,而不是失败。在这方面,请注意,将您的char显式转换为int. 您可以char在需要整数的任何地方直接使用 a 。另一方面,转换为 可能是有意义的unsigned char,因为这会很便宜——可能是免费的,即使是char签名的——而且它将解决你的签名问题。
| 归档时间: |
|
| 查看次数: |
104 次 |
| 最近记录: |