• ベストアンサー

初心者です。

お世話になっています また、みなさんのお力をお貸しください。 いま、わからないところは、 例:Aに "0000" や "001" や "-01"- や "--1" などの整数以外の入力(マイナスと小数点は、入力可能とする)が  おこなわれた時、にエラーとしてはじきたいのですが、はじけない  です。 /* * ソース名:kadai001.c * ソース機能の説明:入力された二つの文字の比較 */ #include <stdio.h> #include <ctype.h> #define MAX 12 /* 読み込み文字数 */ /* 関数 Maxof() * 機能 入力されたAとBの値の大小関係を表示 * ・AはBより大きい場合 * ・AはBより小さい場合 * ・AはBが同じの場合 * 引数 x Aの値 * y Bの値 * 戻り値 無し */ 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場合 * 引数 na Aの値 * 戻り値 0 */ char NuryokuA(char *na) { char temp_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場合 * 引数 nb Bの値 * 戻り値 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) { char A_data[MAX]; /* Aの値 */ char B_data[MAX]; /* Bの値 */ NuryokuA(A_data); NuryokuB(B_data); Maxof(A_data, B_data); return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答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; } (注)インデントのため、全角空白を使っています。

hatenan114
質問者

お礼

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

その他の回答 (5)

  • zwi
  • ベストアンサー率56% (730/1282)
回答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言語の標準では使えません)。

hatenan114
質問者

お礼

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

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.5

「先頭以外に-が来てはいけない(つまり、-が来ていいのは先頭だけ)」 「先頭に0が来た場合、その次は.でなければならない」 という条件はわかりました。 他にもいろいろ条件がありそうですね。 「.が複数あってはいけない」とか「.が先頭に来るのはいいのか悪いのか」とか、... 状態遷移図でも描いて整理してみる方がいいかもしれません。

hatenan114
質問者

お礼

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

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.4

> 「先頭に0が来てはいけない」 > 「先頭以外に-が来てはいけない」 > 「小数点入力があった場合は、0.・・・以外はいけない。」 1個目と3個目が矛盾しています。 1個目に従い、先頭に0が来てはいけないのであれば、 3個目に書いてある「0.何とか」はそもそも成立しません。

hatenan114
質問者

補足

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

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

> 入力時に”000””010””0-1”といったエラー対応をしたかったんです。 できるはずです。 「先頭に0が来てはいけない」「先頭以外に-が来てはいけない」のような、 エラーとすべきすべての条件を日本語で記述してください。

hatenan114
質問者

補足

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

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

やたらと長いけど、 sscanf(nb, " %[-.0123456789] %c", temp_nb, &remit_nb) != 1 が思ったように動かないということ? sscanf() は「読めるところまでをスキャン」するだけなので、ちょっとでも数字らしきものが入力されれば、それが読めて戻り値は 1 になると思います。あるいは改行が %c で読めて戻り値 1か?(書式の指定方法などもう忘れた) そもそも Maxof() 関数は文字列の比較をしているだけなので、NuryokuA(), NuryokuB() の役割がわかりません。数字の入力を辞書式に比較して嬉しいのですか?

hatenan114
質問者

お礼

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

関連するQ&A

  • c言語超初心者です。教えてください

    基本的だと思いますが教えてください。 #include <stdio.h> int main(void) { int na, nb: puts("二つの整数を入力してください."); printf("整数A:”); scanf("%d",&na); printf("整数B:”); scanf("%d",&nb); printf("それらの平均は%fです。\n,(na+nb)/2.0); return(0); } これでintの形で最後のprintfが%fなのですがintは%dとなるはずなのですがこれは2。0という実数値で割るから答えは実数値になりますよ。という意味で%fとしたのでしょうか?確かにこうしないと正しい値がでてこないのです。教えてください。

  • 初心者です。

    以下のソースの説明ですが、例えばnaに5、nbに4を入れたとき、 実行後の表示として  5+6+7+8=26 となるようにしたいのですが、できません。 教えてください。 #include <stdio.h> int main(void) { int sum = 0; int na,nb; printf("整数A:"); scanf("%d",&na); printf("整数B:"); scanf("%d",&nb); /*nbは回数*/ for ( na; na <= nb ;na++){ sum = sum + na; } printf("%dです。\n",sum); return(0); }

  • 教えてください

    case4をキャストしたいのですが、どこにdoubleをつければよいのですか?josan(na/nb)の前においたのですがうまく表示されませんでした。教えてください。 #include <stdio.h> int kasan(int a, int b) { return(a+b); } int gensan(int a, int b) { return(a-b); } int jousan(int a, int b) { return(a*b); } int josan(int a, int b) { return(a/b); } int main(void) { int na, nb, nc; puts("二つの整数を入力してください"); printf("整数A"); scanf("%d", &na); printf("整数b"); scanf("%d", &nb); printf("1:加算\n2:減算\n3:乗算\n4除算\n"); printf("1から4までのどれかを入力してください"); scanf("%d", &nc); switch(nc){ case 1: printf("%d+%dは、%dです。\n", na, nb, kasan(na,nb)); break; case 2: printf("%d-%dは、%dです。\n", na, nb, gensan(na,nb)); break; case 3: printf("%d*%dは、%dです。\n", na, nb, jousan(na,nb)); break; case 4: printf("%d/%dは、%fです。\n", na, nb, josan(na,nb)); break; default: printf("番号が違います。\n"); break; } return(0); }

  • C言語 文字列の比較 compare

    プログラミング初心者です。 60文字以内の文字列を入力して、 大小関係を比較・表示するプログラムなのですが・・ 「AはBより大きい」という結果しか出ません。 どこが間違っているのか、ご指摘お願いしますっ。 #include<stdio.h> int main(void) { char moji1[61]; char moji2[61]; printf("文字列Aを入力===>"); scanf("%60s" ,&moji1); printf("文字列Bを入力===>"); scanf("%60s" ,&moji2); if(moji1-moji2>0){ printf("===AはBより大きい===\n"); } else if(moji1-moji2<0){ printf("===AはBより小さい===\n"); } else if(moji1-moji2==0){ printf("===AとBは等しい===\n"); } return 0; } int compare(char *x, char*y) { while(*x==*y){ if(*x=='\0') return 0; x++; y++; } return (*x-*y); }

  • 配列とポインタについて

    #include <stdio.h> int main() { char x[3]; char *y; x[0]='a'; x[1]='b'; x[2]='\0'; y="abc"; printf("xの値は%s\n",x); printf("yの値は%s\n",y); } 通常の配列宣言では、このままだと文字列をまとめて 代入できないのに対して、ポインタ変数ならまとめて代入することができるのは何故ですか?そういう仕組みだと言われてしまえば、それまでなんですが・・・

  • γ関数のプログラム(初心者です)

    以下のようにγ関数のプログラムを組みました。 とりあえず整数値を入力すれば、正しい値は返しているということがprintfの4で確認できました。 もとはfortranで組んだプログラムをCに置き換えました。 ですが、実際走らせてみると、4で値は確認できますがsegmentation faultが出てしまいます。 ですからサブルーチンファイル(ユーザー関数?)として利用できません。 何がいけないのでしょうか? 正しくyが帰ってくるようにどうなおしたらよいのか教えてください。 #include <stdio.h> #include <math.h> double gamma(double x) { double c[8],y,a,r,b,s; int i; a=1.; r=1.; c[1]=5.771916e-01; c[2]=9.882058e-01; c[3]=8.970569e-01; c[4]=9.182068e-01; c[5]=7.567040e-01; c[6]=4.821993e-01; c[7]=1.935278e-01; c[8]=3.586834e-02; printf("0 %f\n",x); while(1){ if(x>2.){ x=x-1.; a=a*x; printf("1 %f %f\n",x,a); } else if(x<1.){ a=a/x; x=x+1.; printf("2 %f %f\n",x,a); } else{ break; } } x=x-1.; for(i=1;i<8;i++){ b=(double)(i); s=(c[i]*((double)(pow(-1,b))) *((double)(pow(x,b)))); printf("3 %d %f\n",i,c[i]); r=r+s; } y=a*(r+(0.03586834*((double)(pow(-1,8)))*((double)(pow(x,8))))); printf("4 %f\n",y); return y; } main() { double x,y; printf("数字を入力してください。"); scanf("%lf",&x); printf("メインプログラム %lf\n",x); y=gamma(x); printf("%f\n",y); }

  • 値の渡し方?(初心者)

    以前質問したプログラムについて、新たに質問です。 メインプログラムと、関数プログラムを組みました。 関数の中では、print文を使うと計算は正しく行われていて、結果が正しいことが分かりました。 でうが、メイン文の出力では、どこにも出てこない変な値が出てきてしまいます。 値の渡し方がおかしいのでしょうか? 誰か、アドバイスをお願いします。 ***以下プログラムです。*** #include <stdio.h> #include <math.h> double gamma(double x) { double c[9],y,a,r,b,s,z; int i; a=1.; r=1.; c[1]=5.771916e-01; c[2]=9.882058e-01; c[3]=8.970569e-01; c[4]=9.182068e-01; c[5]=7.567040e-01; c[6]=4.821993e-01; c[7]=1.935278e-01; c[8]=3.586834e-02; printf("0 %f\n",x); while(1){ if(x>2.){ x=x-1.; a=a*x; printf("1 %f %f\n",x,a); } else if(x<1.){ a=a/x; x=x+1.; printf("2 %f %f\n",x,a); } else{ break; } } x=x-1.; for(i=1;i<9;i++){ b=(double)(i); s=(c[i]*((double)(pow(-1.,b)))*((double)(pow(x,b)))); printf("3 %d %f\n",i,c[i]); r=r+s; } y=a*r; printf("4 %lf\n",y); return y; } main() { double x,y; printf("数字を入力してください。"); scanf("%lf",&x); printf("メインプログラム x= %lf \n",x); y=gamma(x); printf("x= %f y= %f\n",x,y); }

  • c言語超初心者です。2

    #include <stdio.h> int main(void) { int na,nb, nc; int sum; double ave; puts("三つの整数を入力してください."); printf("整数A:"); scanf("%d", &na); printf("整数B:"); scanf("%d", &nb); printf("整数C:"); scanf("%d", &nc); sum=na+nb+nc; ave=(double)sum/3; printf("それらの合計は%5dです。\n", sum); printf("それらの平均は%5.1fです。\n",ave); return(0); } とういうのを作ったんですが、最後のそれらの合計は%5dとやりその5の意味は整数を10進法で少なくても5桁で表示とありますが、例えば1,2,3と入力しても合計は6とでて5桁ででないんですけど。そういう意味ではありませんか?あとave=(double)sum/3;のところをave=sum/3.0としても問題なくできるのですが、どっちでやったほうがいいとかはありますか?もしあったらその理由も教えてください。

  • 教えてください

    swap関数のprintf("変数名naアドレスは%pです。\n", nx); printf("変数名nbのアドレスは%pです。\n", ny);のnx, nyは、&nx, &nyとしなくていいのですか?同様にswap関数のn1,n2に関しても宜しくお願いします。あと、swap(n1,n2)もどうして&をつけないか教えてください。 #include <stdio.h> void swap (int *nx, int *ny) { int temp = *nx; printf("変数名naアドレスは%pです。\n", nx); printf("変数名nbのアドレスは%pです。\n", ny); *nx =*ny; *ny = temp; } void sort2 (int *n1, int *n2) { printf("変数naのアドレスは%pです。\n",n1); printf("変数nbのアドレスは%pです。\n",n2); if (*n1 >*n2) swap (n1, n2); } int main(void) { int na, nb; puts("二つの整数を入力してください。"); printf("整数A:"); scanf("%d", &na); printf("整数B:"); scanf("%d", &nb); printf("変数naのアドレスは%pです。\n",&na); printf("変数nbのアドレスは%pです。\n",&nb); sort2 (&na, &nb); return (0); }

  • ポインタの問題おしえて

    2つの数値を交換する問題です。 #include<stdio.h> void swap(float *na , float *nb){ float temp= *na; *na = *nb ; *nb = temp; } float main( ){ float a,b; puts("2つの実数の入力"); prinf("a="); scanf("% f ",&a); prinf("b="); scanf("% f ",&b); swap(&a , &b); printf("a= %5.5f b= %5.5f", a, b) ; } これを実行すると kadai3.c: In function `main': kadai3.c:11: warning: return type of `main' is not `int' /tmp/cc0BwKGT.o(.text+0x78):kadai3.c: undefined reference to `prinf' /tmp/cc0BwKGT.o(.text+0x9c):kadai3.c: undefined reference to `prinf' collect2: ld returned 1 exit status こんなエラーが出ました。 いろいろ直しましたがどうして実行されません。 誰かわかる人がいたら間違いを見つけて教えてください お願いします。

専門家に質問してみよう