ページ 11

文字列の制限

Posted: 2014年7月25日(金) 22:33
by みるくたいむ
文字列の入力が 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 }

Re: 文字列の制限

Posted: 2014年7月25日(金) 22:47
by h2so5
とりあえずif文の数は気にせずに書いてみたらよいのではないでしょうか。

Re: 文字列の制限

Posted: 2014年7月25日(金) 22:56
by みるくたいむ
1〜2までの数字 ー  A〜Cまでの英数字 ー 1〜7までの数字 の形式であったら入力をうけつけ、それ以外は再入力させる、ということです。

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

Re: 文字列の制限

Posted: 2014年7月25日(金) 22:57
by h2so5
何度も行うのであれば関数化すればよいと思います。

Re: 文字列の制限

Posted: 2014年7月25日(金) 23:00
by みけCAT
正規表現を利用するのはどうでしょうか?
EZ-NET: C++ で正規表現を使用する - C++ プログラミング
C++ - Cでの正規表現 - Qiita

2番目のサイトは「Cでの正規表現」というタイトルなのにC++のソースコードだったので、C言語に直してみました。
https://ideone.com/UlQDww

Re: 文字列の制限

Posted: 2014年7月25日(金) 23:03
by みけCAT
みるくたいむ さんが書きました: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;
}

Re: 文字列の制限

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

Re: 文字列の制限

Posted: 2014年7月26日(土) 01:29
by かずま-
みるくたいむ さんが書きました:文字列の入力が 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