C言語 正規表現で整数チェック

当分C言語を使ってなかったので、ひさしぶりに書いた内容を残しておきます。
以前、入力した文字列が整数かチェックして、問題なければ整数に変換したいとの相談を受けました。C言語で。とのこと。
ん~正規表現でも使えれば。C言語で使えたっけな。。と調べたところ、
当然のように正規表現を使う方法がありました。そりゃそうですね。

サンプルで作ったコードです。

#include <stdio.h>
#include <stdlib.h>
#include <regex.h>
#include <string.h>

int check_strnum(char* str_num, char* str_word)
{
        int ret = -1;
        regex_t obj_reg;
        size_t num = 1;
        regmatch_t obj_match[num];

        // 文字の開始が整数に該当するかチェックする
        const char pattern[] = "^(-?[0-9]+)";
        memset(str_num, 0, sizeof(str_num));

        // 正規表現パターンの設定(妥当性チェック)
        if (regcomp(&obj_reg, pattern, REG_EXTENDED | REG_NEWLINE) != 0) {
                return ret;
        }
        // 正規表現チェックをする
        if (regexec(&obj_reg, str_word, num, obj_match, 0) != 0) {
                ret = 0;
        } else {
                // マッチした部分を抽出する
                strncpy(str_num, str_word + (int)obj_match[0].rm_so,
                                (int)obj_match[0].rm_eo - (int)obj_match[0].rm_so);
                ret = 1;
        }
        regfree(&obj_reg);
        return ret;
}

int main(int argc, char** argv)
{
        char str_num[128];
        int ret = 0;
        for(int i=1; i < argc; i++){
                ret = check_strnum(str_num, argv[i]);
                printf("[%d]\n\tinput: %s\n\tMatch: %d\n\toutput: %s\n",
                                i, argv[i], ret, str_num);
                if(ret == 1){
                        printf("\tconvert: %d\n", atoi(str_num));
                }
        }
        return 0;
}

タイトルとURLをコピーしました