ページ 1 / 1
文字列の制限
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
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