如何在C中检查uint8数组是否仅包含ASCII元素? 如果可能的话,请转给我检查一下元素是否为ASCII的条件
答案 0 :(得分:5)
您的数组元素为uint8,因此必须在0-255范围内
对于标准ASCII字符集,使用的字节为0-127,因此您可以使用for循环遍历数组,检查每个元素是否为<= 127。
如果您将数组视为字符串,请注意0字节(空字符),它标志着字符串的结尾
从您的示例注释中,可以这样实现:
int checkAscii (uint8 *array) {
for (int i=0; i<LEN; i++) {
if (array[i] > 127) return 0;
}
return 1;
}
它会在第一个大于127的元素处提前爆发。
答案 1 :(得分:2)
所有有效的ASCII字符的值都在0到127之间,因此测试只是一个值检查或7位掩码。例如,假定包含stdbool.h:
bool is_ascii = (ch & ~0x7f) == 0 ;
但是,可能您只打算使用可打印的ASCII字符(不包括控制字符)。在这种情况下,要包含ctype.h:
bool is_printable_ascii = (ch & ~0x7f) == 0 &&
(isprint() || isspace()) ;
就您打算在集合中包含哪些字符而言,您的意图可能略有不同-在这种情况下,可以应用ctype.h中的其他功能,或者只是测试要包括/排除的值或范围的值。
还请注意,ASCII设置在国际上受到严格限制。 ANSI或“扩展的ASCII”集使用特定于语言环境的代码页来定义与代码128到255相关联的字形。也就是说,该集根据语言/语言环境设置而变化,以适应不同的语言字符,重音和字母。在现代系统中,通常会使用多字节Unicode编码(或者有几种使用固定或可变长度代码的编码)。 UTF-8编码是一种可变宽度编码,其中所有单字节编码也是ASCII码。因此,虽然确定数据是否完全在ASCII集中并不容易,但是并不能因此得出数据是 text 的结论。如果该测试旨在区分文本中的二进制数据,则在很多情况下它将失败,除非您可以保证一个先验所有文本都限于ASCII集-并且是特定于应用程序的。 / p>
答案 2 :(得分:2)
在C编程中,字符变量保存的是ASCII值(0到127之间的整数),而不是该字符本身。
小写字母的ASCII值从97到122。并且,大写字母的ASCII值从65到90。
如果给出实际代码,我给你例子。
您可以直接将int分配给char。
int a = 47;
char c = a;
printf("%c", c);
这也将起作用。
printf("%c", a); // a is in valid range
另一种方法。
可以将整数直接分配给字符。字符之所以不同,主要是因为它的解释和使用方式。
char c = atoi("47");
在正确理解以下逻辑之后,尝试实施此操作。
答案 3 :(得分:2)
您不能检查标准C是否为“ ASCII”。
因为C没有指定编译器使用哪个符号表。存在/存在各种其他或多或少的外来符号表。
例如,UTF8是ASCII的超集。存在较旧的功能失常的8位符号表,例如EBCDIC和“扩展的ASCII”。要说出是ASCII还是EBCDIC之类的东西,要经过一长串的值检查就很难做到。
使用标准C,您只能执行以下操作:
isprint()
检查字符是否可打印。 if((ch & 0x7F)==ch)
。