所以,让我说下面有简单的代码:
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中进行这样的测试吗?谢谢你的帮助。
答案 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 */;
}