如何检查字符串是否由C中的数字或字母组成

时间:2016-08-04 11:37:46

标签: c arrays string parsing

我需要一些识别字符串的帮助。我有这样的传入字符串*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#字符串的相同过程。

注意: - 上面两个字符串的字符串长度不一样。

3 个答案:

答案 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 值来比较字符串中的字符。