检查数组是否为ASCII

时间:2018-11-01 08:52:22

标签: c arrays ascii

如何在C中检查uint8数组是否仅包含ASCII元素? 如果可能的话,请转给我检查一下元素是否为ASCII的条件

4 个答案:

答案 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,您只能执行以下操作:

  • 您可以使用ctype.h中的功能isprint()检查字符是否可打印。
  • 或者您可以检查是否仅设置了最多7位if((ch & 0x7F)==ch)