• 締切済み

コードのどこが間違っているのかを教えてください。

ある文字を入力し、それをカンマ区切りして3つに分け、その3つの最大値を表示するプログラムを入力したいです。ただし、条件として、上限の桁数5を越える、文字か数字化の判定を行い、文字が1つでも混ざっている際はエラー表記され再度入力、さらに終了判断を行う際も、あくまで「y」「n」と入力したときのみが正常であり、複数文字を入力する際は、エラー表記され、再度入力という形をとりたいです。 フローを書きながら、サブ関数も使い、LINUXで以下のように書いてみました。 ただ、これだと /*-----------------------------------------*/ /tmp/ccKMOmJN.o: In function `word_judge': kadai6.c:(.text+0x4b2): undefined reference to `isdigits' collect2: ld はステータス 1 で終了しました /*-----------------------------------------*/ となってしまいました。 どのようなコードに直せばいいのでしょうか? すごく長いですが、わかりやすく解説してくださると、とても助かります。 あと、fgets関数やsscanf、getchar関数など、ネット上のサンプルを参照して、使っただけなので、もしかしたら間違ってるかもしれません。 そこについても、教えてくださると、とてもうれしいです。 /* ソースコード */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #define LIMIT (5) #define NULLB '\0' #define ECOUNT (20) #define EWORD (2) int word_judge(char array[]); void digits_judge(int a_len , int b_len , int c_len) ; int main(int argc , char *argv[]) { int number_a ; int number_b ; int number_c ; int input_len ; int a_len ; int b_len ; int c_len ; int end_len ; char input[ECOUNT] ; char a[ECOUNT] ; char b[ECOUNT] ; char c[ECOUNT] ; char array[ECOUNT] ; char end[EWORD] ; end[0] = 'n' ; while( end[0] == 'n' ) { while(1) { number_a = 0 ; number_b = 0 ; number_c = 0 ; input_len = 0 ; a_len = 0 ; b_len = 0 ; c_len = 0 ; end_len = 0 ; memset(input , NULLB , sizeof(char) *ECOUNT) ; memset(a , NULLB , sizeof(char) *ECOUNT) ; memset(b , NULLB , sizeof(char) *ECOUNT) ; memset(c , NULLB , sizeof(char) *ECOUNT) ; memset(end , NULLB , sizeof(char) *EWORD) ; printf("a , b , c ?:") ; fgets(input , ECOUNT , stdin); input_len = strlen(input); if( input_len < ECOUNT-1 ) { sscanf(input , "%[^,] , %[^,], %s" , a , b , c); if(a[0] != NULLB && a[0] != NULLB && c[0] != NULLB) { if(word_judge(a) != 0 && word_judge(b) != 0 && word_judge(c) != 0 ) { a_len = strlen(a) ; b_len = strlen(b) ; c_len = strlen(c) ; if(a_len >= LIMIT || b_len >= LIMIT || c_len >= LIMIT) { digits_judge(a_len , b_len , c_len) ; } else { number_a = strtol(a , NULL , 10) ; number_b = strtol(b , NULL , 10) ; number_c = strtol(c , NULL , 10) ; printf("最大値:") ; if(number_a > number_b && number_a > number_c) { printf("%d\n", a); } else { if(number_b >number_a && number_b > number_c) { printf("%d\n", b) ; } else { printf("%d\n", c) ; } } break ; } } else { printf("文字が混ざっています。\n") ; } } else { printf("正しく入力して下さい。\n") ; } } else { if(input[ECOUNT] == '\n') { } else { while(getchar() != '\n'); } printf("入力数が多いです。\n"); } } while(1) { int end_len ; char end[EWORD] ; end_len = 0 ; memset(end , NULLB , sizeof(char) *EWORD) ; printf("終了しますか? y/n: "); fgets(end , EWORD , stdin); end_len = strlen(end); printf("\n"); if(end_len == EWORD) { if(end[0] != 'y' && end[0] != 'n') { printf("y or nを入力して下さい。\n"); } else { break ; } } else { if(input[ECOUNT] == '\n') { } else { while(getchar() != '\n'); } printf("入力が間違っています。y or n を入力しなおしてください。\n"); } } } return 0 ; } int word_judge(char array[ ]) { int array_len ; int i ; int tmp ; int r_value ; tmp = 0; r_value = 0 ; for(i=0 ; i< array_len ; i++) { tmp = isdigits(array[i]) ; if(tmp != 0) { r_value = 1; } else { r_value = 0; break ; } } return r_value ; } void digits_judge(int a_len , int b_len , int c_len) { int a ; int b ; int c ; a = 0 ; b = 0 ; c = 0 ; a_len = 0 ; b_len = 0 ; c_len = 0 ; if(a_len >= LIMIT) { a = 1 ; } else { } if(b_len >= LIMIT) { b = 10 ; } else { } if(c_len >= LIMIT) { c = 100 ; } else { } switch(a + b + c) { case 111 : printf("aとbとcの桁が多いです。\n"); break; case 11 : printf("aとbの桁が多いです。\n"); break; case 110 : printf("bとcの桁が多いです。\n"); break; case 101 : printf("cとaの桁が多いです。\n"); break; case 1 : printf("aの桁が多いです。\n"); break; case 10 : printf("bの桁が多いです。\n"); break; case 100 : printf("cの桁が多いです。\n"); break; } }

みんなの回答

  • kb-nike
  • ベストアンサー率36% (72/200)
回答No.4

一例としてどうぞ! //-------------------------------------------------------------------- #include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #define LIMIT 5 #define ECOUNT 20 int word_judge(char array[]); void disp_max(char a[], char b[], char c[]); int main( int argc, char *argv[] ) { char input[ECOUNT]; char a[ECOUNT]; // 2次元配列を使いたいところだが… char b[ECOUNT]; char c[ECOUNT]; char *token; int ch; int flag; flag = 0; while(1){ if(flag > 0){ flag = 0; printf("終了: [y]、継続:[その他キー] ?:"); ch = fgetc(stdin); rewind(stdin); // 標準入力のクリア if(ch == 'y' || ch == 'Y') break; } printf("a, b, c ?:") ; fgets(input, ECOUNT, stdin); // ","を区切り子として分割する // 注意:strtok()第2引数には[,]と[スペース]を指定している if((token = strtok(input, ", ")) != NULL){ strcpy(a, token); if((token = strtok(NULL, ", ")) != NULL){ strcpy(b, token); if((token = strtok(NULL, ", ")) != NULL){ strcpy(c, token); } } } if(word_judge(a) < 1){ printf("Error: 文字列 a に数字以外の文字が含まれています!\n"); flag = 1; } if(word_judge(b) < 1){ printf("Error: 文字列 b に数字以外の文字が含まれています!\n"); flag = 1; } if(word_judge(b) < 1){ printf("Error: 文字列 c に数字以外の文字が含まれています!\n"); flag = 1; } if(flag > 0) continue; // 桁数のチェック if(strlen(a) > LIMIT){ printf("Error: 数字列 a の桁数が大き過ぎます!\n"); flag = 1; } if(strlen(b) > LIMIT){ printf("Error: 数字列 b の桁数が大き過ぎます!\n"); flag = 1; } if(strlen(c) > LIMIT){ printf("Error: 数字列 c の桁数が大き過ぎます!\n"); flag = 1; } if(flag > 0) continue; disp_max(a, b, c); break; } // while-end return 0; } // 文字列に数字以外を含むか? int word_judge(char array[]) { int i, n; for(i=0; i<strlen(array); i++){ if(! isdigit(array[i])) return 0; //数字以外を含む } return 1; // 数字以外を含まない } // 3個の数字列の表す整数値の最大値を表示する void disp_max(char a[], char b[], char c[]) { long max; long na, nb, nc; char **ptr = NULL; na = strtol(a, ptr, 10); nb = strtol(b, ptr, 10); nc = strtol(c, ptr, 10); max = na; if(max < nb) max = nb; if(max < nc) max = nc; printf("最大値: %ld\n", max); }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「サブ関数void digits_judge(int a_len , int b_len , int c_len) の部分のエラー表記がされません。」 はもちろんその関数がおかしいから. じっと見ればおかしいことがわかりますよ. ああ, word_judge もおかしいな. あと余談だけどいくつか突っ込んでおく: ・if 文で「条件を満たさないときには何もしない」なら else 以降は書かなくていいだろう. ・word_judge とか digits_judge では意味不明なのでもっと適した名前を付けること. 判定した結果どうであるのかを考えて名前を付けること. また, どちらも「xxxx_judge」という名前であるにもかかわらず一方が真理値を返すのに他方が何も返さないというのはバランスがおかしい. ・strtol を適切に使えば word_judge はそもそも不要. ・memset(input , NULLB , sizeof(char) *ECOUNT) ; などは memset(input, NULLB, sizeof input); などとする方が間違いにくくてより適切.

  • nmktksk
  • ベストアンサー率36% (75/208)
回答No.2

括弧を確認してください。 現在だとend_lenがEWORDじゃなければ printf("入力が間違っています。y or n を入力しなおしてください。\n"); が実行されています。

  • ky072
  • ベストアンサー率60% (85/140)
回答No.1

isdigits → isdigit ではないでしょうか。

nkkkag0407
質問者

補足

追加です。 エラーは表示されなくなりました。早速のご回答、ありがとうございます。 ただ、処理を行うと以下の問題が発生してしまいました。 文字列を正常に入力しなかった場合に、 「正しく入力して下さい」 「文字が混ざっています」 「入力数が多いです」 しかエラー表記されず、 サブ関数void digits_judge(int a_len , int b_len , int c_len) の部分のエラー表記がされません。 また、終了判断を行う際、 「y」入力の時はそのまま終了、 「n」入力の時は再度「a , b , c?」を入力、 「y n以外の文字(1つのみ)」入力の時は、「y or n を入力して下さい」、 「y n以外の文字(2つ以上)」のときは、「入力が間違っています。y or n を入力しなおしてください。」 となるべきなのに、 どれを入力しても、「入力が間違っています。y or n を入力しなおしてください。」と表示されてしまいます。 最大値が変な表示になっていたのは、 printf("%d\n", a) ; printf("%d\n", b) ; printf("%d\n", c) ; を printf("%d\n", number_a) ; printf("%d\n", number_b) ; printf("%d\n", number_c) ; にすれば解決出来たのですが、どうすれば解決できますか?

関連するQ&A

  • 下のコードの修正をお願いします。

    終了処理、バッファのクリアなど、ほとんどの処理は出来たのですが、唯一a,b,cの入力数が上限の桁数LIMITをオーバーしてしまった場合に本来エラーが表示されなければならないのにそのまま正常処理で最大値が出力されてしまいます。つまり、サブ関数void disp_errorでの処理がmain関数で実行されません。 どこを直せばいいのでしょうか? #include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #define LIMIT (5) #define NULLB '\0' #define ECOUNT (3*LIMIT + 4) #define EWORD (3) #define NORMAL (0) #define ABNORMAL (-1) #define LF '\n' int word_judge(char array[]); void disp_error(int x_len , int y_len , int z_len) ; int main(int argc , char *argv[]) { int number_a ; int number_b ; int number_c ; int input_len ; int a_len ; int b_len ; int c_len ; int end_len ; int max ; char input[ECOUNT+1] ; char a[ECOUNT+1] ; char b[ECOUNT+1] ; char c[ECOUNT+1] ; char array[ECOUNT+1] ; char end[EWORD+1] ; end[0] = 'n' ; while(end[0] == 'n' ) { while(1) { number_a = 0 ; number_b = 0 ; number_c = 0 ; input_len = 0 ; a_len = 0 ; b_len = 0 ; c_len = 0 ; end_len = 0 ; max = 0; memset(input , NULLB , sizeof(char) *ECOUNT+1) ; memset(a , NULLB , sizeof(char) *ECOUNT+1) ; memset(b , NULLB , sizeof(char) *ECOUNT+1) ; memset(c , NULLB , sizeof(char) *ECOUNT+1) ; memset(end , NULLB , sizeof(char) *EWORD+1) ; printf("a,b,c ?:") ; fgets(input , ECOUNT+1 , stdin) ; input_len = strlen(input) ; if(input_len <ECOUNT) { a_len = strlen(a) ; b_len = strlen(b) ; c_len = strlen(c) ; sscanf(input , "%[^,], %[^,], %s" , a , b , c) ; if(a[0] != NULLB && b[0] != NULLB && c[0] != NULLB) { if(word_judge(a) == NORMAL && word_judge(b) == NORMAL && word_judge(c) == NORMAL) { if(a_len > LIMIT || b_len > LIMIT || c_len > LIMIT) { disp_error(a_len , b_len , c_len) ; } else { number_a = strtol(a , NULL , 10) ; number_b = strtol(b , NULL , 10) ; number_c = strtol(c , NULL , 10) ; max = number_a ; printf("最大値:") ; if(number_b > number_a) { max = number_b ; if(number_c > number_b) { max = number_c ; } } else { if(number_c > number_a) { max = number_c ; } } printf("%d\n" , max) ; break ; } } else { printf("文字が混ざっています。 \n") ; } } else { printf("正しく、入力をしてください。\n") ; } } else { if(input[ECOUNT-1] == LF) { } else { /* バッファのクリアを行う */ while(getchar() != LF); } printf("入力数が多いです。\n") ; } } while(1) { printf("終了しますか? y/n:" ); fgets(end , EWORD+1 , stdin ) ; end_len = strlen(end) ; if(end_len < 3) { if(end[0] != 'y' && end[0] != 'n') { printf("y or nを入力して下さい。\n") ; } else { break ; } } else { if(end[EWORD-1] == LF) { } else { while(getchar() != LF) ; } printf("入力が間違っています。y or nを入力しなおしてください。\n") ; } } } return 0 ; } int word_judge(char array[]) { int array_len ; int i ; int sub_number ; int r_value ; sub_number = 0 ; r_value = NORMAL ; array_len = strlen(array) ; for(i=0 ; i<array_len ; i++) { sub_number = isdigit(array[i]) ; if(sub_number != 0) { r_value = NORMAL ; } else { r_value = ABNORMAL ; break ; } } return r_value ; } void disp_error(int x_len, int y_len , int z_len) { int fc ; fc = 0 ; if(x_len > LIMIT) { fc += 1 ; } if(y_len > LIMIT) { fc += 10 ; } if(z_len > LIMIT) { fc += 100 ; } switch(fc) { case 11 : printf("aとbの桁が多いです。 \n") ; break ; case 110 : printf("bとcの桁が多いです。 \n") ; break ; case 101 : printf("aとcの桁が多いです。 \n") ; break ; case 1 : printf("aの桁が多いです。 \n") ; break ; case 10 : printf("bの桁が多いです。 \n") ; break ; case 100 : printf("cの桁が多いです。 \n") ; break ; } }

  • C言語のことについて教えてください

    C言語のことで教えてください。お願いします #include <stdio.h> #include <time.h> #include <stdlib.h> #include <string.h> #include <windows.h> int main(int argc, char* argv[]) { char *data[] = {"おひつじ","おうし","ふたご","かに","しし","おとめ","てんびん", "さそり","いて","やぎ","みずがめ","うお"}; int data_len = 12; //データの数 char input[10]; //プレイヤーの入力値 int i,p,start; int win = 1; int mawari = 1; //内回りの場合は1 int p_turn = 0; //プレイヤーのターン if ((argc > 1) && (strcmp(argv[1], "-soto") == 0)) { mawari = 0; } srand(time(NULL)); start = rand()%data_len; printf("古今東西山手線ゲ~ム!\n"); printf("お題:星座の名前\n"); for(p = start,i = 1; i<= data_len; i++,p_turn = !p_turn ) { sleep(500); if(p_turn == 0) {printf("コンピューター");} else if (p_turn == 1) {printf("プレイヤー");} sleep(500); printf("ちゃん! >"); if(p_turn == 0) { printf("%s\n",*(data+p)); } else { scanf("%s", input); while (getchar() != '\n') { } if(strcmp(*(data+p),input) != 0) { win = 0; break; } } if(mawari == 1) { p++; } else {p--;} if((mawari ==1) && (p == data_len)) { p = 0;} if((mawari ==0) && (p == -1)) {p = data_len-1;} } if(win == 1) {printf("あなたの勝ち");} else {printf("あなたの負け");} return 0; } なんですが、どうしても } if(mawari == 1) { p++; } else {p--;} if((mawari ==1) && (p == data_len)) { p = 0;} if((mawari ==0) && (p == -1)) {p = data_len-1;} } 変数Pに今は乱数1-12がはいっているのに、なぜこの処理を行うかがわかりません。どうしてなんですか?教えてください。

  • 分岐について

    「y」もしくは「n」が入力された時、ループから抜けるプログラムを作りたいとおもっています。 一応作ってはみたのですが、なんかスッキリとしない感じなので、 もっと簡単な方法がありましたら教えてもらえないでしょうか? #include <stdio.h> #include <string.h> int main(void) { int cnt; char judge[256]; cnt = 0; memset(&judge[0],'\0',sizeof(judge)); while(1) { printf("y or n : "); fgets(&judge[0],sizeof(judge),stdin); for(cnt = 0 ; judge[cnt] != '\0' ; cnt++) { if(judge[cnt] == '\n') { judge[cnt] = '\0'; break; } } if((judge[0] == 'y' && judge[1] == '\0') || (judge[0] == 'n' && judge[1] == '\0')) { break; } printf("\nError. Input y or n.\n"); } return 0; }

  • 3つの入力した数値の大小比較ができません。

    #include<stdio.h> int main() { int a,b,c; scanf("%d",&a); scanf("%d",&b); scanf("%d",&c); if(a<b) { if(b<c) { if(a<c) { printf("%d<%d<%d\n",a,b,c); } else { printf("%d%d%d",a,b,c); } } if(b>c) { if(a>c) { printf("%d<%d<%d\n",c,b,a); } else { printf("%d<%d<%d\n",a,c,b); } } } else if(a>b) { if(b>c) { if(a>c) { printf("%d>%d>%d\n",a,b,c); } else { printf("%d>%d>%d\n",a,c,b); } } else if(b>c) { if(a>b) { printf("%d>%d>%d\n",a,b,c); } else { printf("%d>%d>%d\n",b,a,c); } } else if(c>b) { if(c>a) { printf("%d<%d<%d\n",b,a,c); } else { printf("%d>%d>%d\n",a,c,b); } } else if(a<c) { if(a<b) { printf("%d<%d<%d\n",a,b,c); } else { printf("%d<%d<%d\n",b,a,c); } } else if(a>c) { if(a<b) { printf("%d>%d>%d\n",b,a,c); } else { printf("%d>%d>%d\n",a,b,c); } } else { printf("%d=%d=%d\n",a,b,c); } } 間違っている部分を教えてください。

  • c言語についての質問です。

    #include<stdio.h> int main(void){ int a; printf("1文字たいぷしてください。\n"); scanf("%d",&a); if(a>=65 && a<=90){ printf("大文字です。\n"); } else if(a>=97 && a<=122){ printf("小文字です。\n"); } else{ printf("大文字でも小文字でもありません\n"); } return 0; } このプログラムは正しくなくて、 intをchar %dを%cにかえなければなりません。 なぜintはダメなんでしょうか? できれば丁寧に教えてください。 お願いします。

  • C言語のソースコードについて教えてください。

    以下のソースコードを学習用C言語開発環境で行ったのですが、 『ファイル「C:/Users/ユーザー名/AppData/Local/EasyIDEC/project/タイトル/main.c」の 「41行目」で記述エラーを発見しました。 「,」を付け忘れています。』 という、コンパイルエラーが表示されました。 何度も見直したのですが、よくわかりません。 #include <stdio.h> int main(int argc, char *argv[]) { char answer ; answer = 'n' ; while(answer =='n') { int input ; input = 0 ; int add ; add = 1 ; int sum ; sum = 0 ; printf("数値を入力して下さい。:") ; scanf("%d", &input ) ; int i ; i = 0 ; while(i < input) { sum =sum + add ; printf("\n%d",sum) ; i++ ; add++ ; } printf("\n1から%dまでの総和は、%dです。" , input , sum) ; while(1) { printf("\n終了しますか? y/n:") ; scanf(" %c , &answer) ; if( (answer != 'y') && (answer != 'n') ) { printf( "y or nを入れてください。") ; } else { break ; } } } return 0 ; }

  • プログラミング(配列と関数の引数)

    a : ABCDE a : ABCDEFGH Len : 8 a : FGHIJ a : FGH a : FGH, c : FGH 上記のように表示されるプログラムを作りたいのですが、なかなかできません。下記のようなプログラムを作ったのですがどこが間違っているのかよくわかりません。分かる方、指摘をお願いします。 #include <stdio.h> void my_strcpy(char s[], char t[]); int my_strlen(char s[]); void my_strcat(char s[], char t[]); int main(){ char a[10]; char b[10] = "ABCDE"; char c[] = "FGH"; int len; my_strcpy(a, b); printf("a : %s\n", a); my_strcat(a, c); printf("a : %s\n", a); len = my_strlen(a); printf("Len : %d\n", len); my_strcpy(a, "FGHIJ"); printf("a : %s\n", a); a[3] = '\0'; printf("a : %s\n", a); if(strcmp(a, c) == 0){ printf("a : %s, c : %s\n", a, c); } int i, s, t; my_strcpy(a, b + 2); printf("a : %s\n", a); void my_strcpy(char s[], char t[]){ for (i = 0; t[i] != '\0'; i++){ s[i] = t[i]; } s[i] = '\0'; } int my_strlen(char s[]){ int i; for (i = 0; s[i] != '\0'; i++); return i; } void my_strcat(char s[], char t[]){ int i, j; for (i = 0; s[i] != '\0'; i++); for (j = 0; t[j] != '\0'; i++, j++){ s[i] = t[j]; } s[i] = '\0'; } }

  • 大学の授業で作った暗号化プログラムが動きません。

    下記のような暗号化プログラムを作成したのですが動きません。 問題のある場所は36行目(/で囲まれた行)で式の構文エラーと診断されたのですが、どう直せばいいのか分かりません。 どなたかどうすればよいのかお教え下さい。 #include <stdio.h> #include <stdlib.h> #include <ctype.h> int anngou (int c, char b[81]) { while (c <= 81) { if(b[c] >= 'a' && b[c] <= 'z') { if(b[c] >= 'a' && b[c] <= 'm') { b[c] = b[c] + 13; } else { b[c] = b[c] - 13; } } else { if(b[c] >= 'A' && b[c] <= 'Z') { if(b[c] >= 'A' && b[c] <= 'M') { b[c] = b[c] + 13; }else{ b[c] = b[c] - 13; } } } } return b[c]; } int main(void) { int a, c; char b[81]; a = c = 0; while (a <= 9) { printf("Input some words: "); fgets(b, 81, stdin); /b[c] = anngou(char b[c]);/ c = 0; while (c <= 81) { printf("%s", b[c]); c++; } printf("\n"); a++; } exit(0); }

  • 2つの自然数を入力しその間にある素数を表示する

    2つの自然数を入力して、その間にある素数を表示するプログラムです。 #include <stdio.h> main( ) { int a,b,c,i,j; printf("Input number 1:"); scanf("\n%d",&a); printf("Input number 2:"); scanf("\n%d",&b); if(a>b){ c=a; a=b; b=c; } for(i=a;a<b+1;i++){ for(j=2;j<i-1;j++){ if(i%j!=0){j++;} else{ if(i=j){ printf("\n%d",i); } } } } } i=aからbまで j=2からi-1まで iはjで 割り切れるか NO→(jを1つ増やす) YES→iはjと等しいか YES→iの値を表示 NO→(iを1つ増やす) END この部分がよくわかりませんfor文を使うんですか? ご指導お願いします。

  • 初歩的な質問です char同士が同じ値(=)の確認について

    これはサンプルですが値は 「bad」を返してしまいます。 char 同士の=判定はどのようにすればいいでしょうか? どちらとも数字が入っていますが、charをintに変更する必要があるのでしょうか?もしそうだとしたらどうしたらいいのか教えてください^^ #include "stdio.h" main(){    char a[10]={"555"};   char b[10]={"555"};     if(a==b){      printf("good\n");     }else{      printf("bad\n");   } }

専門家に質問してみよう