strtol関数を使った数値変換プログラムの修正方法

このQ&Aのポイント
  • strtol関数を使用して数値変換プログラムを修正する方法について解説します。
  • プログラムは、入力された数値を指定の進数で変換し、変換結果を出力します。
  • 修正する際には、文字列の先頭に空白がある場合や符号の処理に注意する必要があります。
回答を見る
  • ベストアンサー

strtol関数をmalloc()関数を使用して次のソースプログラムを

strtol関数をmalloc()関数を使用して次のソースプログラムを修正しなさいを言われました。 どなたか詳しい方よろしくお願いします。 #include <limits.h> #include <ctype.h> #include <errno.h> #include <stdio.h> int _space_sign(const char *s, const char **endptr); int _space_sign(const char *s, const char **endptr) { int sign ; while (isspace((unsigned char)*s)) ++s; sign = 0; switch (*s) { case '-': sign = -1; // fall through case '+': ++s; break; } *endptr = s; return sign; } long int strtolong(const char * s, char ** endptr, int base) { int c; int sign = _space_sign(s, (const char**)&s); long result; if (s[0] == '0') { ++s; if ((s[1] | 0x20) == 'x') { if (base == 0 || base == 16) { ++s; base = 16; } } else if (base == 0) base = 8; } else if (base == 0) base = 10; result = 0; for (; c = tolower((unsigned char)*s), isdigit(c) || ('a' <= c && c <= 'v'); s++) { int d ; if( isdigit(c) ) d= c - '0' ; else d = c - 'a' + 10; if (d >= base) break; if (result > (LONG_MAX - d - sign) / base) { errno = ERANGE; result = sign ? LONG_MIN : LONG_MAX; } else { result = result * base + d; } } if (endptr != NULL) *endptr = (char*)s; if (sign != 0) result = -result; return result; } int main(void) { char s[128], *e; long n; int base; printf("何進数で変換しますか。"); scanf("%d", &base); printf("変換する数値を入力してください。"); scanf("%s", s); n = strtolong(s, &e, base); if (errno != ERANGE) { printf("変換数値=%ld\n", n); if (*e != '\0') { printf("変換不可能部分=%s\n", e); printf("%d文字目の\'%c\'が変換不可\n", e-s+1, *e); } } else if (n == LONG_MAX) printf("long値で表現できる値を上回りました。\n"); else if (n == LONG_MIN) printf("long値で表現できる値を下回りました。\n"); return 0; }

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

  • ベストアンサー
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

「strtol関数とmalloc()関数を使用して次のソースプログラムを修正しなさい」 ということなのかな?

その他の回答 (2)

  • anicicle
  • ベストアンサー率36% (129/356)
回答No.2

何のためにmallocを利用するのか理解に苦しむ。 ASCI相当のstrtolならmallocは必要としない。 なぜmallocを使用する必要があるのか理解しているのだろうか?

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

日本語がおかしいので何をしていいのかわからんが, とりあえず strtolong がバグってるっぽいことはわかった. EBCDIC って知ってる?

関連するQ&A

  • プログラムの関数化

    皆様に助けていただき、なんとかコーディング出来たのですが、関数化したいと思います。アドバイスお願いします。 int overflow_check1(); int overflow_check2(); int overflow_check3(); int overflow_check4(); int lop; // 左のオペランドに入力する値 int rop; // 右のオペランドに入力する値 int result; // 計算結果 int mod; // 除算の余り int max = INT_MAX; // 表現可能な最大値 int min = INT_MIN; // 表現可能な最小値 char *check; // 変換不能な文字を格納 char op; // 入力する演算子 int main ( int argc, char *argv[] ) { /* 引数の個数チェック */ if ( argc != 4 ) { printf ( "usage : %s lop op rop\n", argv[0] ); exit ( 0 ); } /* 引数を取得して整数型に変換 */ lop = atoi ( argv[1] ); rop = atoi ( argv[3] ); /* 引数の取得 */ op = ( argv[2][0] ); /* startが整数であるか文字であるかのチェック */ lop = strtol ( argv[1], &check, 10 ); if ( errno != ERANGE ) { if ( *check != '\0' ) { printf ( "error : 整数を入力して下さい。\n" ); exit ( -1 ); } /* startに範囲を超えた値を入力した場合 */ } else { printf( "error : 整数型の範囲を超えました。\n" ); exit( -1 ); } /* endが整数であるか文字であるかのチェック */ rop = strtol ( argv[3], &check, 10 ); if ( errno != ERANGE ) { if ( *check != '\0' ) { printf ( "error : 整数を入力して下さい。\n" ); exit ( -1 ); } /* endに範囲を超えた値を入力した場合 */ } else { printf( "error : 整数型の範囲を超えました。\n" ); exit( -1 ); } /* argv[2]が2文字以上の場合 */ if ( strlen ( argv[2] ) >= 2 ) { printf ( "error : 演算子を正しく入力して下さい。\n" ); exit ( -1 ); } /* argv[2]に入力された演算子が'+'の場合 */ switch ( op ) { case '+': overflow_check1(); result = lop + rop; break; /* argv[2]に入力された演算子が'-'の場合 */ case '-' : overflow_check2(); result = lop - rop; break; /* argv[2]に入力された演算子が'*'の場合 */ case '*': overflow_check3(); result = lop * rop; break; /* argv[2]に入力された演算子が'/'の場合 */ case '/' : /* 0による除算 */ if ( rop == 0 ) { printf ( "error : 0による除算は禁止です。\n" ); exit ( -1 ); } overflow_check4(); result = lop % rop; // 剰余を求める break; default: printf ( "error : '+' '-' '*' '/'のいずれかの演算子を入力して下さい。\n" ); exit ( -1 ); } /* 割り算の結果として余りが出なかった場合 */ if ( result == 0 ) { result = lop / rop; printf ( "%d %c %d = %d", lop, op, rop, result ); exit ( 0 ); /* 割り算の結果として余りが出た場合 */ } else { result = lop / rop; mod = lop % rop; printf ( "%d %c %d = %d余り%d", lop, op, rop, result, mod ); exit ( 0 ); } /* 数値1 演算子 数値2 = 演算結果の形式で出力する */ printf ( "%d %c %d = %d", lop, op, rop, result ); exit ( 0 ); } int overflow_check1 () { /* オーバーフローのチェック */ if ( lop > 0 && rop > 0 ) { if ( lop > max - rop ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( 0 ); } } /* オーバーフローのチェック */ if ( lop < 0 && rop < 0 ) { if ( lop < min - rop ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( 0 ); } } return 0; } int overflow_check2 () { /* オーバーフローのチェック */ if ( lop > 0 && rop < 0 ) { if ( lop > max + rop ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( 0 ); } } /* オーバーフローのチェック */ if ( lop < 0 && rop > 0 ) { if ( lop < min + rop ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( 0 ); } } return 0; } int overflow_check3 () { /* オーバーフローのチェック */ if ( lop > max / rop ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( -1 ); } /* オーバーフローのチェック */ if ( rop < max / lop ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( 0 ); } return 0; } int overflow_check4 () { /* オーバーフローのチェック */ if ( ( lop == min ) && ( rop == -1 ) ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( -1 ); } return 0; }

  • malloc関数について。

    typedef struct a{ char *simei; int nenrei; }MEIBO; void main(void) { MEIBO a[5]; int wa; for(i = 0; i <= 4; i++ ) { a[i].simei = malloc(100 * sizeof(char) ); if( a[i].simei == NULL ) /* 領域確保に失敗したか */ { printf( "%dバイトの領域確保に失敗", 100 * sizeof(char) ); return 1; } printf("%d番目を入力してください\n",i+1); scanf("%s",&a[i].simei); printf("%s\n",a[i].simei); } C言語初心者です。これで入力したa[i].simeiが表示されないのですが、間違いを指摘していただけますでしょうか。宜しくお願いします。

  • C言語 ソースを見ていただきませんか?  getopt , malloc , qsort の使い方を教えてください。

    Linux環境で、ソースを書きましたが、実行すると可笑しくなります。 達人の方々に見ていただきたいのです。 概要: 1. .txt ファイルから、データを読み込み、    サイズを調べ、メモリを確保、    「qsort」で 昇順、降順を出力ファイルに書き出す。 2. 実行すると -ia.txt -oxxx.txt -A     [1] 3234 [2] 3445 [3] 5544 -ia.txt -oxxx.txt -D [1] 5544 [2] 3445 ソース #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <search.h> #include <ctype.h> #include <errno.h> typedef struct { fpos_t pos; int val; } Entry; typedef int (CFP)(const void *, const void *); void error(const char *msg){ fprintf(stderr, "%s\n", msg); exit(1); } static int cmpstringp(const void *p, const void *b){ return strcmp(* (char * const *) p, * (char * const *) b); } int main(int argc,char *argv[]) { int iflag = 0; int oflag = 0; int uflag = 0; int v , a , dumy ,b , c , i , ln, sz ; char lines; char *m ; char *s; char *p , *p1 ,*p2 ; char input_file[64]; char output_file[64]; FILE *fp1, *fp2; unsigned long siz; while(( c = getopt (argc, argv, " i:o:AD"))!=-1){ switch (( char ) c ) { case 'i': iflag = 1; strcpy( input_file , optarg ); break; case 'o': oflag = 1; strcpy( output_file , optarg ); break; case 'A': uflag = 1; break; case 'D': uflag = 0; break; default : fprintf(stderr, "usage : command[-Z] [keyword]\n"); exit(1); } } printf( "input=%s output=%s uflag=%d\n" , input_file , output_file , uflag ); fp1 = fopen( input_file, "r" ); if( fp1 == NULL ) { printf( "%sが開けません:%d" , input_file , errno ); return 0; } if ( fseek(fp1, 0L, SEEK_END) == -1L) { printf( "fseek() がエラー:%d" , errno ); return 0; } if ( (siz = ftell(fp1)) == -1L) { printf( "ftell() がエラー:%d" , errno ); return 0; } printf ("siz=%d\n" , siz ); m = ( char * ) malloc ( siz * 2 ); if ( m == NULL ){ printf ("メモリが確保できません\n"); return 0; } if ( fseek(fp1, 0L, SEEK_SET) == -1L) { printf( "fseek() がエラー:%d" , errno ); return 0; } fp2 = fopen( output_file, "w" ); if( fp2 == NULL ) { printf( "%sが開けません:%d" , output_file , errno ); return 0; } lines = 0; p = m; sz = siz; while( 1 ) { if( fgets( p , sz, fp1 ) == NULL ) { break; } ln = strlen( p ); p += ln + 1; sz -= ( ln + 1 ); ++lines; } p = m; for( i=0 ; i<lines ; ++i ) { sz = strlen( p ); printf( "%d : %s\n" , i , p ); p += sz + 1; } for (a = 1; a < 24 ; a++) { for( v = a + 1 ; v < 25 ; v++ ) { if ( p[a] < p[v] ) { dumy = p[a]; p[a] = p[v]; p[v] = dumy; } } } printf("- - 昇順 - -\n"); for ( a = 1; a < 25 ; a++ ) { printf ( "[%d] = %d\n\n", a , p[a]); } qsort ( p , sz , sizeof( char* ), cmpstringp ); for (a = 1; a < 24 ; a++) { for( v = a + 1 ; v < 25 ; v++ ) { if ( p[a] < p[v] ) { dumy = p[a]; p[a] = p[v]; p[v] = dumy; } } } printf ("\n\n"); printf("- - 降順 - -\n"); for ( a = 1; a < 25 ; a++ ) { printf ( "[%d] = %d\n\n", a , p[a]); } exit; fclose (fp1); fclose (fp2); return; } よろしくお願いいたします。

  • malloc関数(strtok関数の自作版)につきまして分からないこと

    malloc関数(strtok関数の自作版)につきまして分からないことがあります。 以下のプログラムにmallo関数がフリーする最適な位置を明示しなさいといわれました。 文字が分離した時にfreeすると助言されたのですが いまいち理解できません・・・。 条件式の中で使用するともいわれていました。(おそらくif文・・・。) 色んな意見を参考にしたいので詳しい方助言のほうよろしくおねがいします。 なおプログラムはほかの箇所を変更したり、他の場所でもmalloc関数を使用することが認められています。 またfreeする場所はメイン関数ではなくあくまでもstrtok関数の中で宣言するようです。 よろしくお願いします。 #include <string.h> #include <stdio.h> #include <stdlib.h> main(){ char* s2 = ",/"; char* result; char* r1; char* r2; char* r3; char* r4; result = strtok("//123//,45/,678,9/","/,"); r1 = strtok(NULL, s2); r2 = strtok(NULL, s2); r3 = strtok(NULL, s2); r4 = strtok(NULL, s2); printf("%s\n",result); printf("%s\n",r1); printf("%s\n",r2); printf("%s\n",r3); printf("%s\n",r4); return; } char *strtok(char *s1, const char *s2) { int i,len; char *str1, *str2 , *str3; static char *tok ; static char* mstr; if(s1 != NULL) { str1 = s1; } else { str1 = tok; } str2 = str1 + strspn(str1, s2); /* strspnを利用 */ if (*str2 == '\0') { return (NULL); } len = 1; i = 0; while(*(str2 + i) != '\0'){ len++; i++; } mstr = (char*)malloc(sizeof(char)*len); if(mstr == (NULL)) { return 0; } i = 0; while(*(str2 + i) != '\0'){ *(mstr + i) = *(str2 + i ); i++; } *(mstr + i ) = '\0'; str3 = mstr + strcspn(mstr, s2); /* strcspnを利用 */ if (*str3 != '\0'){ *str3 = '\0'; str3 = str3 + 1; } tok = str3; return (mstr); }

  • よく分からない関数?がある

    プログラミングが良く分かっていないため、このプログラムを読みきる事ができませんでした。 #include <stdio.h> int (*get_sign)(); int iget_sign(int *a); int dget_sign(double *a); main(){ int sgn, idt=5; //intを2つ作成。idtは5 double fdt = -3.234; //ダブル型のfidを作成、数値は-3.234 get_sign = iget_sign; //不明:get_sigin sgn = get_sign(&idt); //get_siginにidtの数値を渡してsgnにいれてる printf("*date:%d sgn:%d\n",idt ,sgn); get_sign = dget_sign; sgn = get_sign(&fdt); printf("*data:%lf sgn:%d\n", fdt, sgn); } int iget_sign(int *a){ if(*a == 0) return 0; else if(*a > 0) return 1; else return -1; } int dget_sign(double *a){ if(*a == 0) return 0; else if(*a > 0.0) return 1; else return -1; } 数値が0なら0を、プラスなら1をマイナスなら-1を返すプログラムだと言うことは分かります。 しかし、2行目の「int (*get_sign)();」や10行目の「get_sign = iget_sign; //不明:get_sigin」が良く分かりません。 ぜひアドバイスをお願いします。

  • 2つ分数の四則演算を行うプログラム

    <要求事項> 分数は、 例)1|3 のように表す。 1.分母がゼロの時はエラーとする。 2.除算において、除数がゼロの入力エラーに対しては、再入力するように促す。 3.以下範囲の整数(分子、分母にかかわらず)に対して、正しく計算できるようにする。   -2147483648 ~ 2147483647 4.計算結果については,分母が1の時には分子のみ表示。分数がの時には0のみを表示。最終計算結果は既約分数にする。分数が負数の場合、-を分数の前に表示。 #include <stdio.h> #include <math.h> int main(void) { int b,d; /* 分母*/ int a,c; /* 分子*/ int sign,sign2,sign3,sign4; int yakusu,yakusu2,yakusu3,yakusu4; /* 最大公約数*/ printf("分母= "); scanf("%d",&b); printf("分子= "); scanf("%d",&a); if(b==0){ printf("分母が0です。入力が誤っています。\n"); /*分母が0ならエラーとする*/ return 0; } if (a==0){ printf("分数1= 0\n"); /*分子が0のとき*/ } else{ printf("分数1=%d|%d\n",a,b); /*一つ目の分数*/ } printf("\n"); printf("分母= "); scanf("%d",&d); printf("分子= "); scanf("%d",&c); if(d==0){ printf("分母が0です。入力が誤っています。\n"); /*分母が0ならエラーとする*/ return 0; } if (c==0){ printf("分数2= 0\n"); /*分子が0のとき*/ } else{ printf("分数2=%d|%d\n",c,d); /*二つ目の分数*/ } printf("\n"); /* 足し算:a|b + c|d = (a*d + b*c) | (b*d) */ printf("足し算:%d|%d + %d|%d\n",a,b,c,d); yakusu = gcd(abs(a*d + b*c),abs(b*d)); /*最大公約数を求める*/ sign = (a*d + b*c)/abs(a*d + b*c) * (b*d/abs(b*d)); if(sign * abs(a*d + b*c)/yakusu == 0){ /*分子が0となる時*/ printf("0\n"); } if (abs(b*d)/ yakusu!= 1){ printf("既約分数は %d|%d\n" ,sign * abs(a*d + b*c)/yakusu , abs(b*d)/yakusu ); } else{ printf("既約分数は %d\n" ,sign * abs(a*d + b*c)/yakusu ); /*分母が1の場合*/ } printf("\n"); /* 引き算:a|b - c|d = (a*d - b*c) | (b*d) */ printf("引き算:%d|%d - %d|%d\n",a,b,c,d); yakusu2 = gcd(abs(a*d - b*c),abs(b*d)); /*最大公約数を求める*/ sign2 = (a*d - b*c)/abs(a*d - b*c) * (b*d/abs(b*d)); if(sign2 * abs(a*d - b*c)/yakusu2 == 0){ /*分子が0となる時*/ printf("0\n"); } if (abs(b*d)/ yakusu2!= 1){ printf("既約分数は %d|%d\n" ,sign2 * abs(a*d - b*c)/yakusu2 , abs(b*d)/yakusu2 ); } else{ printf("既約分数は %d\n" ,sign2 * abs(a*d - b*c)/yakusu2 ); } printf("\n"); /* 掛け算:a|b * c|d = (a*c) | (b*d) */ printf("掛け算:%d|%d * %d|%d\n",a,b,c,d); yakusu3 = gcd(abs(a*c),abs(b*d)); /*最大公約数を求める*/ sign3 = (a*c)/abs(a*c) * (b*d/abs(b*d)); if(sign3 * abs(a*c)/yakusu3 == 0){ /*分子が0となる時*/ printf("0\n"); } if (abs(b*d)/ yakusu3!= 1){ printf("既約分数は %d|%d\n" ,sign3 * abs(a*c)/yakusu3 , abs(b*d)/yakusu3 ); } else{ printf("既約分数は %d\n" ,sign3 * abs(a*c)/yakusu3 ); /*分母が1の場合*/ } printf("\n"); /* 割り算:a|b / c|d = (a*d) | (b*c) */ printf("割り算:%d|%d / %d|%d\n",a,b,c,d); yakusu4 = gcd(abs(a*d),abs(b*c)); /*最大公約数を求める*/ sign4 = (a*d)/abs(a*d) * (b*c/abs(b*c)); if(sign4 * abs(a*d)/yakusu4 == 0){ /*分子が0となる時*/ printf("0\n"); } if (abs(b*c)/ yakusu4!= 1){ printf("既約分数は %d|%d\n" ,sign4 * abs(a*d)/yakusu4 , abs(b*c)/yakusu4 ); } else{ printf("既約分数は %d\n" ,sign4 * abs(a*d)/yakusu4 );/*分母が1の場合*/ } return 0; } int gcd(int x,int y){ /* ユークリッド互除法*/ int z; if( (x <= 0) || (y <= 0) ){ return -1; } z = x % y; while (z != 0){ x = y; y = z; z = x % y; } return y; } >>大学の課題です。現在の状態は上記の通りです。このプログラムだと、答えの既約分数が0になると表示できなかったり、桁が大きい数で計算しようとすると値がおかしくなってしまいます。 どなたかプログラム改良にご助力願えないでしょうか?

  • 万年カレンダーのプログラム(C言語)が分からなくて困っています。

    万年カレンダーのプログラム(C言語)が分からなくて困っています。 一応作ってみたけどダメだったので何処がおかしいか指摘してくれると幸いです あとC言語についてはかなり初心者ですすみません #include <stdio.h> int main(void) { int d[13]={ 31 ,28 ,31 ,30 ,31 ,30 ,31 ,31 ,30 ,31 ,30 ,31 }; char youbi[7][4]={"日","月","火","水","木","金","土"}; int y ,m ,n ,a ,b ,c ,cc ,s ,ss ,e; printf("西暦 月 日を入力"); scanf("%d ""%d ""%d ",y,m,n); for(a = 1900 ; a < y ; a++){ if(a % 4 == 0){ if(a % 400 == 0){ s = s+2; } else{ s = s+1; } } if(a % 100 == 0){ s = s+1; } else{ s = s+2; } } if(y % 4 == 0){ if(y % 400 == 0){ ss = ss+2; } else{ ss = ss+1; } } if(y % 100 == 0){ ss = ss+1; } else{ ss = ss+2; } if(ss == 2){ d[1] = 29; } else{ d[1] = 28; } for(b = 0 ; b < m+2 ; b++){ e = d[m] + e; m = m+1; } e = e+n; c = e%7; s = c+s; cc = s%7; printf("%c",youbi[cc]); return 0; }

  • このソースがわかりません

    #include <stdio.h> #include <time.h> #include <stdlib.h> int card[4][13]; char total[13] = { 11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 }; char *digit[13] = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" }; char *mark[4] = { "ハート", "ダイヤ", "スペード", "クローバー" }; int drawCard(int h); int main() { int dealer; //ディーラーの引いたカードの合計 int player; //プレイヤーの引いたカードの合計 int draw_digit; //引いたカードの数 int draw_mark; //引いたカードのマーク char y_n; //カードを引くか引かないかの答え srand(time(NULL)); printf("【ブラックジャック】\n"); //ディーラーが引く draw_mark = rand() % 4 + 1; draw_digit = rand() % 13 + 1; card[draw_mark-1][draw_digit-1] = 1; dealer = total[draw_digit-1]; printf("ディーラー一枚目:%sの%s\n", mark[draw_mark-1], digit[draw_digit-1]); printf("他は伏せる\n\n"); //プレイヤーが引く printf("プレイヤー一枚目:"); player = drawCard(1); printf("プレイヤー二枚目:"); player += drawCard(1); //ディーラー2枚目以降 do{ dealer += drawCard(0); } while(dealer <= 16); //プレイヤー3枚目以降 while(player < 21) { printf("もう1枚引きますか?(y/n) > "); scanf("%c" , &y_n); while (getchar() != '\n') { } if(y_n == 'y') { player += drawCard(1); } else if (y_n == 'n') { break; } } printf("\nディーラー:%d点 プレイヤー:%d点\n", dealer, player); //勝敗の判定 if ((dealer <= 21 && player > 21) || (dealer <= 21 && dealer > player)) { printf("ディーラーの勝ち!\n"); } else if ((player <= 21 && dealer > 21) || (player <= 21 && player > dealer)) { printf("プレイヤーの勝ち!\n"); } else { printf("引き分け\n"); } return 0; } /*カードを引く関数 引数 h:カード内容表示フラグ プレイヤーターンの時は1、ディーラーターンの時は0 戻り値 r:引いたカードの点数 */ int drawCard(int h) { int draw_mark, draw_digit; //引いたカードのマークと数 int r; //引いたカードの点数 char y_n; //カードを11として計算するかどうかの答え do { draw_mark = rand() % 4 + 1; draw_digit = rand() % 13 + 1; } while (card[draw_mark-1][draw_digit-1]); card[draw_mark-1][draw_digit-1] = 1; if(h) { printf("%sの%s\n", mark[draw_mark-1], digit[draw_digit-1]); } if(h && draw_digit == 1) { //プレイヤーターンで引いた数が1のとき do { printf("11として計算しますか?(y/n) > "); scanf("%c" , &y_n); while (getchar() != '\n') { } if(y_n == 'y') { r = total[draw_digit-1]; } else if (y_n == 'n') { r = 1; } } while(!(y_n == 'y' || y_n == 'n')); } else { r = total[draw_digit-1]; } return r; } この「char total[13] = { 11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 };」の部分がなぜchar型なのかとなぜ、必要なのかです 後もう一つ} while (card[draw_mark-1][draw_digit-1]);のー1はなぜですか?教えてください、おねがいします

  • C言語のソースの説明なんですが

    #include <stdio.h> #define MAX 256 void pushdown(char *S, char x); char popup(char *S); void initialize(char *S); int empty(char *S); int top=0; void pushdown(char *S, char x){ /*スタックSにデータxを記憶*/ if(top<MAX){ top++; S[top]=x; } else{ printf("Stack S overflows.\n"); } } char popup(char *S){ /*スタックSからデータの取出し*/ if(top>0){ top--; return(S[top+1]); } else{ printf("Stack S is empty.\n"); return('\0'); } } void initialize(char *S){ int i; top=0; for(i=1;i<MAX;i++){ S[i]='\0'; } } int empty(char *S){ if(top==0){ return(1); } return(0); } int main(void){ char x; char S[MAX]; pushdown(S,'a'); pushdown(S,'b'); pushdown(S,'c'); x=popup(S); x=popup(S); pushdown(S,'d'); x=popup(S); pushdown(S,'e'); while(!empty(S)){ printf("%c", popup(S)); } printf("\n"); return(0); } 上記のソースリストに説明を載せなくてはいけないのですがどれが何をしているのかほとんど分からなくて困っています。(わかったのは既に書いてある2行分ぐらい) 長くて面倒ですが判る方、どうか助けてください。 (インデント等は省いています)

  • 関数のアドレスをコピーすることについて

    ◎1--------------------------- #include<stdio.h> void (*putdata)(int d);  //// (1) //// void english(int dt); void japanese(int dt); int main( ) { int a=234; putdata=english; putdata(a); putdata=japanese; putdata(a); return 0; } void english(int dt) { printf("Value is %d.\n",dt); } void japanese(int dt) { printf("数値は%dです.\n",dt); } --------------------------------- ◎2-------------------------------- #include<stdio.h> int (*get_sign) ( ); //// (2) //// int iget_sign(int *a); int dget_sign(double *a); int main( ) { int sgn,idt=6; double fdt=-2.123; get_sign=iget_sign; sgn=get_sign(&idt); printf("data:%d sgn:%d\n",idt,sgn); get_sign=dget_sign; sgn=get_sign(&fdt); printf("data:%f sgn:%d\n",fdt,sgn); return 0; } int iget_sign(int *a) { if(*a==0) return 0; else if(*a>0) return 1; else return -1; } int dget_sign(double *a) { if(*a==0.0) return 0; else if(*a>0.0) return 1; else return -1; } --------------------------------- 以上2つのプログラムについて疑問があります。 ◎1の「putdata=english;」と関数のアドレスをコピーするにおいて、(1)の部分の引数の「(int d)」がどういう意味があるか分かりません。 次に◎2の(2)の部分で、「int (*get_sign) ( );」と引数を空にするというのが理解できません。本当は(2)の部分を、「int (*get_sign)(void *a);」 にしなくてはいけないと参考書に書いてあったのですが、何故そうしなくてはいけないかも理解できません。 C++で実行すると、チェックが厳しいということで、エラーが出てしまうというのは、参考書には書いてあったのですが、その前に(1)、(2)での関数プロトタイプの引数の表現方法が理解できません。 教えていただけると嬉しいです。

専門家に質問してみよう