文字列の制限

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
みるくたいむ

文字列の制限

#1

投稿記事 by みるくたいむ » 9年前

文字列の入力が 1-A-3 、1-B-3 のような形式でないものが入力された場合、再入力させるプログラムを書きたいんですが、
if分をたくさん書かずにすむ良い方法はありませんか?

現在は下記のような状態です。エラー処理を行いたいです。
reserve_seatの関数内で、入力の形式が違った場合再入力したいです。
 void input_chomp(char *__str,int buf_size)
13 {
14 ^ char *p;
15 ^ fgets(__str ,buf_size,stdin);
16 ^ p = strchr(__str,'\n');
17 ^ if(p != NULL) *p = '\0';
18 }

void input_reserve_seat( reserve_data *r_d )
92 {
93 ^ int r_t,i;
94
95 ^ //座席入力
96 ^ for( i=0; i < r_d -> people_number; i++ ){
97 ^ ^ input_chomp( r_d -> seat_number,BUFSIZE );
98 ^ }
99 }

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 文字列の制限

#2

投稿記事 by h2so5 » 9年前

とりあえずif文の数は気にせずに書いてみたらよいのではないでしょうか。

みるくたいむ

Re: 文字列の制限

#3

投稿記事 by みるくたいむ » 9年前

1〜2までの数字 ー  A〜Cまでの英数字 ー 1〜7までの数字 の形式であったら入力をうけつけ、それ以外は再入力させる、ということです。

このような入力制限をほかの場面でも、何度も行うのでif分の数が多くなってしまい、非常にソースが長くなってしまうんです。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 文字列の制限

#4

投稿記事 by h2so5 » 9年前

何度も行うのであれば関数化すればよいと思います。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 文字列の制限

#5

投稿記事 by みけCAT » 9年前

正規表現を利用するのはどうでしょうか?
EZ-NET: C++ で正規表現を使用する - C++ プログラミング
C++ - Cでの正規表現 - Qiita

2番目のサイトは「Cでの正規表現」というタイトルなのにC++のソースコードだったので、C言語に直してみました。
https://ideone.com/UlQDww
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 文字列の制限

#6

投稿記事 by みけCAT » 9年前

みるくたいむ さんが書きました:if分をたくさん書かずにすむ良い方法はありませんか?
「if文を書かない」ことが目的なら、if文の代わりにwhile文やswitch文を利用すればいいかもしれません。
ただし、breakやcontinueでif文を利用した時のようにはループを抜けられなくなるので、
その場合はフラグで管理するなどの工夫が必要になります。

変換例1(before)

コード:

if(hoge) {
    /* fuga */
}
変換例1(after)

コード:

while(hoge) {
    /* fuga */
    break;
}
変換例2(before)

コード:

if(foo) {
    /* bar */
} else {
    /* piyo */
}
変換例2(after)

コード:

switch(foo) {
    case 0: {
        /* piyo */
    } break;
    default: {
        /* bar */
    } break;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

みるくたいむ

Re: 文字列の制限

#7

投稿記事 by みるくたいむ » 9年前

迅速な回答ありがとうございます!
わかりにくい質問で、申し訳ございません! 
メールアドレスの形式が正しいかどうかなど、
入力が正しいのか判定する場面が何度もありif文の数が多くなってしまいsmartでないような気がしたので、質問いたしました!
C言語でも正規表現使えるのですね!!
正規表現を使って行いたいと思います。
ありがとうございました。

かずま-

Re: 文字列の制限

#8

投稿記事 by かずま- » 9年前

みるくたいむ さんが書きました:文字列の入力が 1-A-3 、1-B-3 のような形式でないものが入力された場合、再入力させるプログラムを書きたいんですが、
if分をたくさん書かずにすむ良い方法はありませんか?
sscanf で書くこともできます。

コード:

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

int main(void)
{
    char buf[256], c[2], *p;
    while (printf(">> "), fgets(buf, sizeof buf, stdin)) {
        if (p = strchr(buf, '\n')) *p = 0;
        if (sscanf(buf, "%1[12]-%1[ABC]-%1[1-7]%c", c, c, c, c) == 3)
            puts("OK");
        else
            puts("NG");
    }
    return 0;
}
実行結果

コード:

>> a-A-1
NG
>> 1-A-1
OK
>> 2-C-7
OK
>> 1-B-8
NG
>> 3-A-3
NG
>> 1A5
NG
>> ^Z

閉鎖

“C言語何でも質問掲示板” へ戻る