最近Cを勉強しはじめたものです。
文字列のチェックでどうしていいのかわからないので
アドバイス下さい!
ユーザからデータのサイズ入力を求めた後、入力された数字と、文字列入力のチェックをしたいのです。考えてることはこうです。
(1)ユーザにデータのサイズ入力を求める。
(2)ユーザはサイズを入力する。
この時、認められている入力形式は
・100
・100B
・100M
・100MB
のような4パターンの入力が可能。
(ちなみにMだけでなく、K、Gも可能にできるように考えています。)
(3)この入力された文字列をチェックする。
・0だけ入力は認めない。
・数字とK、M、G、B、KB、MB、GBの組み合わせはOKそれ以外の文字や文字列は認めない。
・100MBはOKだが、M100BやMB100などは認めない。
とすると、一つ一つチェックしていくと
ソースの階層がどんどん深くなっていく気がして
混乱しています。
どのようにすればスッキリできるでしょうか?
また、このような文字列比較ができる関数やAPIがありましたら教えて下さい。
宜しくお願いします。
No.1ベストアンサー
- 回答日時:
スッキリ解決する方法、あります。
【正規表現】です
まず結論から…
質問内容を正規表現で表現するとこんな感じでしょうか…
"[0-1]+[KMGkmb]?[Bb]?"
ですのでこれとマッチしてるかどうかをチェックするだけですので、正規表現の1ステップと if文の1ステップだけでチェック完了させることができます。すばらしいでしょ?
正規表現というのを分かり易く言うと、文字列のパターンの表現方法のことで、あなたがやりたいようなこととピッタリあいます。
正規表現ではないですが Windowsだと dosプロンプトなんかで
dir *.txt とか
del aaa??.dat とかって 「*」や「?」を使った表現をやりますよね?あれをもっと汎用的に拡張したものです。
ただし言語によって準備されているライブラリの状況が異なります。
★ Java の場合 JDK1.4 で標準で用意されてます。
★ C++ の場合 標準で用意されてません。以下のライブラリが使えます。
http://www.boost.org/
★ C の場合 標準で用意されてません。
これは使ったことないですが、以下で発見しました。
http://www.sip.eee.yamaguchi-u.ac.jp/kou/regex.h …
おそらくあなたが質問した内容だと一発でチェックできると思われます。最近Cを始めたということなので敷居は高いかもしれませんが、こういうのがあるという事は覚えておいてください。今回は使わなかったとしても将来は役に立つと思われます。
Yahoo! や Google で「正規表現とは」などのキーワードで検索すればもっと詳しいことがわかります。
No.5
- 回答日時:
struct {
char ss[4] ;
long long vv ;
} arry[] = { { "B", 1LL },
{ "K", 1024LL}, {"KB", 1024LL },
{ "M", 1024LL * 1024LL }, {"MB", 1024LL * 1024LL },
{ "G", 1024LL * 1024LL * 1024LL}, {"GB", 1024LL * 1024LL * 1024LL}} ;
val = strtol(input, &endptr, 10) ;
if (*endptr != NULL) {
for (ii 0 ; ii < (sizeof(arry) / sizeof(arry[0])) ; ii++) {
if (strcmp(endptr, arry[ii].ss) == 0) {
break ;
}
}
if (ii == (sizeof(arry) / sizeof(arry[0]))) {
/* 単位がおかしい */
}
lval = val * arry[ii].vv ;
} else {
lval = val ;
}
1.strtolで数値変換をしながら単位部の有無をチェック
2.単位部があれば内容をチェック。その際、配列を使うことで処理を簡素化
コンパイルしてません。
No.4
- 回答日時:
#include <stdio.h>
#define MAX_STR 19
char errchk(char *str)
{
char flg=0;
while(*str!=NULL){
switch(*str) {
case '9':
case '8':
case '7':
case '6':
case '5':
case '4':
case '3':
case '2':
case '1':
if(flg>1) return(0);
flg=1;
case '0':
if (flg!=1) return(0);
break;
case 'K':
case 'k':
case 'M':
case 'm':
case 'G':
case 'g':
if(flg!=1) return(0);
flg=2;
break;
case 'B':
case 'b':
if((flg==2)||(flg==1)) {
flg=3;
break;
}
default:
return(0);
}
str++;
}
return (flg);
}
void main(void)
{
char str[MAX_STR][15]={
"100",
"100B",
"100M",
"100MB",
"100K",
"100KB",
"100M",
"100MB",
"0",
"K0B",
"010B",
"10TB",
"M10B",
"MB10",
"10KB 100KB",
"10BK",
"10BB",
"10KK",
"10MK",
};
char i,errf;
for(i=0;i<MAX_STR;i++){
errf=errchk(str[i]);
printf("%2d:'%s':",i+1,str[i]);
if (errf) printf("OK!\n");
else printf("NG!\n");
}
}
独自処理する場合、自分で関数を作りましょう!
ここでは毎回入力するのは面倒だったので、テストパターンの配列にしていますが、実際には入力ルーチンに変更して下さい。
KBやMB等の入力で小文字入力される可能性があるのでこのチェックもしておいた方がいいですね。
頑張って下さい。
No.3
- 回答日時:
正規表現だと ([1-9]|[1-9][0-9]+)[GMKgmk]?[Bb] でしょうねえ。
Cで無難にやるなら
int size;
char unit[16];
sscanf("100MB","%ld%s",&size,unit);
if(!stricmp(unit,"GB")) {
} else if(!stricmp(unit,"MB")) {
} else if(!stricmp(unit,"KB")) {
} else if(!stricmp(unit,"B")) {
} else {
/* error */
}
とかでしょう。
No.2
- 回答日時:
ちょっと間違えました。
誤 "[0-1]+[KMGkmb]?[Bb]?"
正 "[0-9]+[KMGkmg]?[Bb]?"
かな。
また、この表現だと
>・0だけ入力は認めない。
には対応してません
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CPU・メモリ・マザーボード 「コンピューターのメモリが不足しています」 3 2022/12/15 22:07
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- Visual Basic(VBA) エクセルVBAについて 2 2023/01/31 16:21
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
- Java Java 南京錠 2 2023/02/04 11:46
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- Excel(エクセル) エクセルのマクロを教えてください。 1 2022/03/30 09:29
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/06/15 14:11
- Excel(エクセル) エクセルのマイナス表示 3 2022/03/28 16:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正負を反転させて出力するプロ...
-
double型が正常に認識されてい...
-
C言語 While文(ループ)内の...
-
数字以外が入力されたらエラー...
-
プログラムC言語の整数の約数に...
-
C言語 逆ピラミッドの作り方
-
2進数の1の数を数える問題
-
4桁の数字以外を入力したらエラ...
-
ダメだ・・・分からない。while...
-
入力値が1以下、かつ数字以外の...
-
VBでの日付入力値のフォーマッ...
-
c言語でひらがなのしりとりをで...
-
scanfが2回使えない・・・?;
-
Eclipseでコマンドラインを入力...
-
プログラム(C)
-
C言語でのカレンダー作成
-
キーボード入力の終了につきま...
-
C言語 for文をつかって記号を表...
-
C言語でつるかめ算をするにはど...
-
プログラミング初心者です。 Py...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
正負を反転させて出力するプロ...
-
数字以外が入力されたらエラー...
-
プログラミング初心者です。 Py...
-
double型が正常に認識されてい...
-
java初心者です。入力されたの...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
C言語scanf_sで何故か2回入力に...
-
if文の条件にscanf関数を使うと…?
-
プログラミングの問題です 「金...
-
Linuxで入力待ちなしkeyread関...
-
ワードで文字を入力する時の変...
-
cout関数を使っているのですが...
-
batプログラム上で文字列を入力...
-
Userformの入力順序をタブオー...
-
scanf が無視されます
-
C言語 逆ピラミッドの作り方
-
gets_sがうまく動かない
-
Excel VBAで、Application.Inpu...
おすすめ情報