我需要一些识别字符串的帮助。我有这样的传入字符串*H1999999#
它可能与*H1000000#~*H1999999#
有所不同,有时它是*H1FINE#
或*H1MED#
或其他任何文本。现在我已经做过的是我有解析数字字符串并将整数值复制到缓冲区。这是代码。
char H1subbuff[10];
char *ptr;
if ((strncmp(rec,"*H1", 3) == 0) && (rec[9] == '#'))
{
memcpy(H1subbuff, &rec[3], 6 );
H1subbuff[6] = '\0';
H1Val = strtol(H1subbuff, &ptr, 10);
//Display H1VAL
}
现在我的查询是如何检查字符串是否由数字或字母组成。如何检查H1subbuff
数据,以便我可以进行比较。我需要执行上述解析*H1FINE#
字符串的相同过程。
注意: - 上面两个字符串的字符串长度不一样。
答案 0 :(得分:3)
您可以使用它来确定它是否为数字
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void
check_string(const char *string)
{
char *endptr;
long int value;
if (strstr(string, "*H1") == NULL)
return; // This string is not valid
// Move after the '*H1'
string += 3;
if (strchr(string, '#') == NULL)
return; // Missing the '#'
// Now we can try to determine whether the content
// between '*H1' and '#' is a number, or text
value = strtol(string, &endptr, 10);
// This simply compares pointer values, if `endptr'
// has the same value as `string`, then `strtol()' didn't
// find any numeric character, i.e. the first one
// in the data pointed to by `string' was non-numeric
if (endptr == string)
fprintf(stdout, "It's NOT a number\n");
else if (*endptr == '#')
fprintf(stdout, "It's a number: %ld\n", value);
else
fprintf(stdout, "It's almost a number\n");
}
首先我们执行一些完整性检查,一旦我们知道它是候选者,我们就可以尝试确定分隔部分是否为数字。
请注意"It's almost a number"
部分,这意味着并非*H1
和#
分隔的所有字符都是数字,但少数首先是,然后是非数字字符。
此外,如果允许在分隔部分中嵌入“#”,例如转义它,则此代码将无效。
答案 1 :(得分:2)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>
bool validate_data(const char rec[], int *number, char text[]){
*number = -1;//if invalid
*text = 0; //if invalid
if(strncmp(rec, "*H1", 3) != 0) return false;//invalid header
bool not_digit = false;
int i, j = 0;
for(i = 3; rec[i] && rec[i] != '#'; ++i){
text[j++] = rec[i];
if(!isdigit(rec[i]))
not_digit = true;
}
text[j] = 0;
if(rec[i] != '#'){
*text = 0;
return false;//invalid footer
}
if(not_digit == false){
if(j != 6){
*text = 0;//valid as text?
return false;//invalid number format
}
*number = atoi(text);
}
return true;
}
int main(void){
const char *test_data[] = {
"*H1000000#","*H1999999#", "*H1123456#", "*H1FINE#", "*H1MED#",
"*h123#", "**H1666666#", "*H2888888#", "*H1777#", "*H1555555"
};
int number_of_data = sizeof(test_data)/sizeof(*test_data);
char H1subbuff[10];
int H1Val;
for(int i = 0; i < number_of_data; ++i){
printf("%s :\n", test_data[i]);
if(validate_data(test_data[i], &H1Val, H1subbuff)){
if(H1Val >= 0)
printf("value is %d(%s)\n", H1Val, H1subbuff);
else
printf("text is %s\n", H1subbuff);
} else {
printf("invalid format\n");
}
puts("");
}
return 0;
}
答案 2 :(得分:1)
如果问题中只有两个输入字符串 你可以直接比较它们并相应地采取行动。
如果不是这种情况,那么您可以使用 ASCII 值来比较字符串中的字符。