我想在特定位置检查数组中的某些字符。
该数组以 $$$$ 开头,然后有八个字符,然后是另一个 $,再有八个字符,最后是 $$$$。例如char my_array[50] = "$$$$01FF4C68$02543EFE$$$$";
我想检查所有应该有 $ 的位置是否都有它们。
我可以将数组分成包含字符的三个部分,然后分别测试它们,但有没有更好的方法呢?
我想在特定位置检查数组中的某些字符。
该数组以 $$$$ 开头,然后有八个字符,然后是另一个 $,再有八个字符,最后是 $$$$。例如char my_array[50] = "$$$$01FF4C68$02543EFE$$$$";
我想检查所有应该有 $ 的位置是否都有它们。
我可以将数组分成包含字符的三个部分,然后分别测试它们,但有没有更好的方法呢?
为什么要把事情复杂化?
if (my_array[0] != '$'
|| my_array[1] != '$'
|| my_array[2] != '$'
|| my_array[3] != '$'
|| my_array[12] != '$'
|| my_array[21] != '$'
|| my_array[22] != '$'
|| my_array[23] != '$'
|| my_array[24] != '$')
{
printf("Wrong!\n");
}
采用strstr()
检查数组是否以 8 个 $ 开头:strstr(my_array, "$$$$$$$$")
检查数组是否以八个 $ 结尾:strstr(my_array + 16, "$$$$$$$$")
+16 用于移动指针,因此 my_array + 16 的开头将是 $ 应该在的位置。
您可能想使用strstr functinn 来查找$$$
....
是的,你可能想使用正则表达式,请阅读http://www.peope.net/old/regex.html
如果您使用 POSIX 兼容的平台,并且您的代码中即将出现一些更复杂的模式,您可以查看正则表达式,例如PCRE
您也可以避免使用 strstr,因为格式简单且固定;直到示例格式成立::
bool ok = strlen(my_array) >= 25 /* just be sure there are at least all expected chars */ &&
strncmp(my_array, "$$$$", 4) == 0 &&
strncmp(my_array + 12, "$", 1) == 0 /* my_array[12] == '$' */&&
strncmp(my_array + 21, "$$$$", 4) == 0;
不使用该string.h
库的一个长选项是,进行 3 个测试:
#include <stdio.h>
int firstTest( char a[] );
int secondTest( char a[] );
int thirdTest( char a[] );
int main (void)
{
int result;
char my_array[50] = "$$$$01FF4C68$02543EFE$$$$";
if( ( firstTest( my_array ) == 1 ) && ( secondTest( my_array ) == 1 ) && ( thirdTest( my_array ) == 1 ) ){
printf( "The string is valid.\n" );
result = 1;
}
else{
printf( "The string is invalid.\n" );
result = 0;
}
return 0;
}
int firstTest( char a[] )
{
int i;
for( i = 0; i < 4; i++ ){
if ( a[i] != '$' ){
return 0;
break;
}
return 1;
}
}
int secondTest( char a[] )
{
if( my_array[12] != '$' )
return 0;
else
return 1;
}
int thirdTest( char a[] )
{
int i;
for( i = 21; i < 25; i++ ){
if ( a[i] != '$' ){
return 0;
break;
}
return 1;
}
}
sscanf 应该做的工作
char my_array[50] = "$$$$01FF4C68$02543EFE$$$$";
int n,m;
if( !sscanf(my_array,"$$$$%*8[0-9A-H]%n$%*8[0-9A-H]$$$$%n",&n,&m) && n==12 && m==25 )
puts("ok");
else
puts("not ok");