お世話になっています
また、みなさんのお力をお貸しください。
いま、わからないところは、
例:Aに "0000" や "001" や "-01"- や "--1"
などの整数以外の入力(マイナスと小数点は、入力可能とする)が おこなわれた時、にエラーとしてはじきたいのですが、はじけない です。
/*
*ソース名:kadai001.c
*ソース機能の説明:入力された二つの文字の比較
*/
#include<stdio.h>
#include<ctype.h>
#defineMAX12/* 読み込み文字数 */
/* 関数 Maxof()
* 機能入力されたAとBの値の大小関係を表示
* ・AはBより大きい場合
* ・AはBより小さい場合
* ・AはBが同じの場合
* 引数 xAの値
* yBの値
* 戻り値 無し
*/
void Maxof(char *x, char *y)
{
if (strcmp(x , y) == 0){/* AはBが同じの場合 */
printf("A(%s)はB(%s)と同じ\n", x, y);
} else if (strcmp(x , y) > 0){/* AはBより大きい場合 */
printf("A(%s)はB(%s)より大きい\n", x, y);
} else {/* AはBより小さい場合 */
printf("A(%s)はB(%s)より小さい\n", x, y);
}
}
/* 関数 NuryokuA()
* 機能Aの値の入力を行う
* ・エラー1場合
* ・エラー2場合
* ・エラー3場合
* 引数 naAの値
* 戻り値 0
*/
char NuryokuA(char *na)
{
chartemp_na[MAX];/* Aの値 */
char remit_na;/* 格納する文字の制限 */
do {/* Aの値がエラー文字の場合はループ */
printf("Aの値を入力してください。:");
if (fgets(na, sizeof na, stdin) == NULL) return 1;
}while (sscanf(na, " %[-.0123456789] %c", temp_na, &remit_na) != 1
|| Error_syori( na ) == 1 || strlen(temp_na) != MAX);
return 0;
}
/* 関数 NuryokuB()
* 機能Bの値の入力を行う
* ・エラー1場合
* ・エラー2場合
* ・エラー3場合
* 引数 nbBの値
* 戻り値 0
*/
char NuryokuB(char *nb)
{
char temp_nb[MAX];/* Bの値 */
char remit_nb;/* 格納する文字の制限 */
do {/* Bの値がエラー文字の場合はループ */
printf("Bの値を入力してください。:");
fgets(nb, sizeof nb, stdin);
}while (sscanf(nb, " %[-.0123456789] %c", temp_nb, &remit_nb) != 1
|| strlen(temp_nb) != MAX);
return 0;
}
int main(void)
{
charA_data[MAX];/* Aの値 */
char B_data[MAX];/* Bの値 */
NuryokuA(A_data);
NuryokuB(B_data);
Maxof(A_data, B_data);
return 0;
}
No.2ベストアンサー
- 回答日時:
目的はよくわからないですが、こんなことをしたいのでしょうか。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXLEN (12)
#define NG (0)
#define OK (!NG)
int checkData(char *str)
{
char *p = str;
for (; *p; p++)
if (!isdigit(*p) && *p != '-' && *p != '.')
return NG;
return OK;
}
void inputData(char *str, int len, char *msg)
{
do {
printf("%s", msg);
fgets(str, len, stdin);
if (str[strlen(str)-1] == '\n')
str[strlen(str)-1] = '\0';
} while (checkData(str) == NG);
}
void maxOf(char *s, char *t)
{
int n = strcmp(s, t);
printf("A(%s)はB(%s)", s, t);
printf("%s\n", n == 0 ? "と同じ" : n > 0 ? "より大きい" : "より小さい");
}
int main(void)
{
char aData[MAXLEN], bData[MAXLEN];
inputData(aData, MAXLEN, "Aの値を入力してください > ");
inputData(bData, MAXLEN, "Bの値を入力してください > ");
maxOf(aData, bData);
return 0;
}
(注)インデントのため、全角空白を使っています。
回答有難うございます。
このような感じなのですが、入力時に”000””010””0-1”といったエラー対応をしたかったんです。
やはり、”000””010””0-1””0000.1”といったイレギュラー入力をはじくことは難しいのでしょうか?
No.6
- 回答日時:
>ちなみに、これらを判定するときに、使う関数をおしてえもらえないでしょうか??
万能な関数はありませんし、文字列処理の理解のためにも自分で1バイトづつ判定するのをお勧めします。
簡単に短く書く方法を考える前に、泥臭く全部の条件を書いていきましょう!
状態変移が難しいということですので、こんな書き方はどうでしょう?
()の中の数字でif文の深さを表してします。そのままif文で書いても可。
(1)0バイト目が0x00?
文字列の終了なので、NG。
(2)0バイト目が'0'
(2-1)1バイト目が0x00
文字列の終了なので、OK。
(2-2)1バイト目が'.'
(2-2-1)2バイト目が0x00
文字列の終了なのでNG? ← 自分で仕様を決めてください。
・
・
と書き出していきます。
途中で同じことの繰り返しが出てきたらループ化したり一部を関数化したり、再帰呼び出しを使ったりしてプログラムを整理しましょう。
こんな処理は正規表現で処理すると比較的簡単なんですけどね(C言語の標準では使えません)。
No.5
- 回答日時:
「先頭以外に-が来てはいけない(つまり、-が来ていいのは先頭だけ)」
「先頭に0が来た場合、その次は.でなければならない」
という条件はわかりました。
他にもいろいろ条件がありそうですね。
「.が複数あってはいけない」とか「.が先頭に来るのはいいのか悪いのか」とか、...
状態遷移図でも描いて整理してみる方がいいかもしれません。
すごいですねぇー!
本当ですね。色々でてきます。
状態遷移図は、名前はしっているのですが、うまく書けません。
ちなみに、これらを判定するときに、使う関数をおしてえもらえないでしょうか??
No.1
- 回答日時:
やたらと長いけど、
sscanf(nb, " %[-.0123456789] %c", temp_nb, &remit_nb) != 1
が思ったように動かないということ?
sscanf() は「読めるところまでをスキャン」するだけなので、ちょっとでも数字らしきものが入力されれば、それが読めて戻り値は 1 になると思います。あるいは改行が %c で読めて戻り値 1か?(書式の指定方法などもう忘れた)
そもそも Maxof() 関数は文字列の比較をしているだけなので、NuryokuA(), NuryokuB() の役割がわかりません。数字の入力を辞書式に比較して嬉しいのですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列から空白を取り除きたい...
-
fgetsなどのときのstdinのバッ...
-
テキストデータをそのままバイ...
-
簡単な電卓プログラムについて
-
間接参照のレベルが異なっています
-
charからLPTSTRへの変換方法
-
CStringをwchar_tに変換したい
-
C言語で文字列からパラメタをss...
-
バイトスワップをやりたい
-
絶対パスからのファイル名の切...
-
型変換
-
_TCHAR*での引数の読み込み
-
atoi( ) の反対をやりたい
-
charでの計算?
-
”あいうえお” を ”おえういあ...
-
数値を文字化するにはどうすれ...
-
C言語のfor文です。 繰り返しの...
-
Linuxでフォルダ内全ファイル名...
-
文字列の中のカンマを消したい
-
初心者です。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
CStringをwchar_tに変換したい
-
charでの計算?
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
'const char *' 型は 'char *' ...
-
テキストデータをそのままバイ...
-
配列をnビットシフトする
-
半角カナ→16進
-
double型の値をchar配列に変換...
-
sprintfに同じ変数は使えるか
-
ファイル名である文字列からbas...
-
ネットワークにつながっている...
-
ftoa の作り方
-
間接操作のレベルとは
-
型変換
-
C言語です
-
C言語のfor文です。 繰り返しの...
-
Win32APIでのエディットボック...
-
【C言語】文字型と整数型の違い
おすすめ情報