人生のプチ美学を教えてください!!

お世話になっています
また、みなさんのお力をお貸しください。
いま、わからないところは、
例: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;
}

A 回答 (6件)

目的はよくわからないですが、こんなことをしたいのでしょうか。




#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;
}

(注)インデントのため、全角空白を使っています。
    • good
    • 0
この回答へのお礼

回答有難うございます。
このような感じなのですが、入力時に”000””010””0-1”といったエラー対応をしたかったんです。
やはり、”000””010””0-1””0000.1”といったイレギュラー入力をはじくことは難しいのでしょうか?

お礼日時:2007/10/17 21:34

>ちなみに、これらを判定するときに、使う関数をおしてえもらえないでしょうか??


万能な関数はありませんし、文字列処理の理解のためにも自分で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言語の標準では使えません)。
    • good
    • 0
この回答へのお礼

ありがとうございます。
まずは、自分で何かの作ってみます。
  

お礼日時:2007/10/18 19:51

「先頭以外に-が来てはいけない(つまり、-が来ていいのは先頭だけ)」


「先頭に0が来た場合、その次は.でなければならない」

という条件はわかりました。
他にもいろいろ条件がありそうですね。
「.が複数あってはいけない」とか「.が先頭に来るのはいいのか悪いのか」とか、...

状態遷移図でも描いて整理してみる方がいいかもしれません。
    • good
    • 0
この回答へのお礼

すごいですねぇー!
本当ですね。色々でてきます。
状態遷移図は、名前はしっているのですが、うまく書けません。
ちなみに、これらを判定するときに、使う関数をおしてえもらえないでしょうか??

お礼日時:2007/10/17 23:35

> 「先頭に0が来てはいけない」


> 「先頭以外に-が来てはいけない」
> 「小数点入力があった場合は、0.・・・以外はいけない。」

1個目と3個目が矛盾しています。
1個目に従い、先頭に0が来てはいけないのであれば、
3個目に書いてある「0.何とか」はそもそも成立しません。

この回答への補足

あっ、そうですね。
すみません。
では、
0.何とか以外は、0からの入力はできない。
という、条件はできますか???

難しいです。

補足日時:2007/10/17 22:55
    • good
    • 0

> 入力時に”000””010””0-1”といったエラー対応をしたかったんです。



できるはずです。
「先頭に0が来てはいけない」「先頭以外に-が来てはいけない」のような、
エラーとすべきすべての条件を日本語で記述してください。

この回答への補足

回答有難うございます。

エラー条件ですが、
「先頭に0が来てはいけない」
「先頭以外に-が来てはいけない」
「小数点入力があった場合は、0.・・・以外はいけない。」
です。

補足日時:2007/10/17 22:45
    • good
    • 0

やたらと長いけど、



sscanf(nb, " %[-.0123456789] %c", temp_nb, &remit_nb) != 1

が思ったように動かないということ?

sscanf() は「読めるところまでをスキャン」するだけなので、ちょっとでも数字らしきものが入力されれば、それが読めて戻り値は 1 になると思います。あるいは改行が %c で読めて戻り値 1か?(書式の指定方法などもう忘れた)

そもそも Maxof() 関数は文字列の比較をしているだけなので、NuryokuA(), NuryokuB() の役割がわかりません。数字の入力を辞書式に比較して嬉しいのですか?
    • good
    • 0
この回答へのお礼

説明不十分で、すみません。
入力時に”000””010””0-1”といったエラー対応をしたかったんです。

お礼日時:2007/10/17 21:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!