コードのどこが間違っているのかを教えてください。
ある文字を入力し、それをカンマ区切りして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;
}
}
お礼
詳細で丁寧な解説ありがとうございます。 やっと理解出来ました。 私の場合、「Number(n+m.n);」の部分を「Number((n+m).n);」のように勝手に解釈して、 その先入観がずっと頭から離れず堂々巡りをしておりました。