如何测试c-string是否包含某些ascii范围之外的字符?

时间:2017-06-03 19:44:08

标签: c

所以,让我说下面有简单的代码:

int main() {
    char string1[256]="TEST1";
    char string2[256]="TESTOK"; //Also could be "TEST OK"

    if(//string doesn't contain "A-Z" || doesn't contain "SPACE")
    {
        //do something
    }

    return 0;
}

在if语句的位置,我想要做的就是让string1进入if语句,因为它包含除ASCII字符A-Z或SPACE之外的其他内容。但是,在string2的两个示例中,我希望它们绕过if语句,因为它包含AZ或者可能有一个SPACE,这一切都可以,并且应该意味着char字符串不会进入if语句。 / p>

我找不到用c做这个的简单方法来测试这个。我考虑过循环遍历所有字符并测试ASCII值是否为某个值范围或等于32为空格。然而,这似乎过于复杂。另外,我故意设置256比字符串中的字符数量大,所以我担心NULL字符可能会搞乱。

无论如何,有一种简单的方法可以在C中进行这样的测试吗?谢谢你的帮助。

3 个答案:

答案 0 :(得分:3)

strcspn()

中使用strspn()(或<string.h>)原型
char okchar[] = "ABC...Z 0123456789";
if (strspn(input, okchar) == strlen(input)) /* ok */;

答案 1 :(得分:2)

我认为迭代字符不会太复杂:

int i = 0;
while (string1[i] != '\0') {
    if (!((string[i] >= 'A' && string[i] <= 'Z') || string[i] == ' ')) {
        printf("Not good\n");
        break;
    }
    ++i;
}

修改:

正如Stargateur评论的那样,使用isupper会更优雅:

int i = 0;
while (string1[i] != '\0') {
    if (!(isupper(string[i]) || string[i] == ' ')) {
        printf("Not good\n");
        break;
    }
    ++i;
}

答案 2 :(得分:1)

  

ASCII字符A-Z或空格。

源代码的编码可能不是ASCII - 这很少见,但却可以区分源代码,例如EBCIDIC编码和字符串内容,从外部输入读取,这将被解释为ASCII数据。

注意:无论编码如何, null字符的值都为'\0'

这是代码应该使用32,65和90的时间。#define ASCII_A 'A'不起作用,因为'A'在源代码的编码中被解释,这可能会有所不同来自ASCII。

#define ASCII_SPACE 32
#define ASCII_A 65
#define ASCII_Z 90

也无需在循环中测试 null字符

// return true if `s` contains only ASCII A-Z or space and then the null character
bool test_ASCII_AZ_space(const char *s) {
  while ((*s >= ASCII_A && *s <= ASCII_Z) || (*s == ASCII_SPACE)) {
    s++;
  }
  return *s == '\0';
}

为了实现可移植性,@pmg建议使用strspn()要求使用ASCII值形成模式字符串。也不需要使用strlen()再次运行字符串,只需检查strspn()返回的值是否索引到 null字符

const char okchar[] = { 32, 65, 66, 67, 68, 69,
  70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, '\0' };

if (input[strspn(input, okchar)] == '\0') {
  /* ok */;
}