• ベストアンサー

printfが!

int main(void){ .... while(!(i==EOF)){ num=0; while((i=fgetc(stream))!='\n'){ if(i==EOF) break; str[num]=i; num++; } kannsuu1(); kannsuu2(); } return 0; void kannsuu1(void){ printf("出力されない"); for(i=0;str[i]!=NULL;i=i+2){ printf("%c%c",str[i],str[i+1]);/*これも出力されない*/ } } void kannsuu2(void){ .... } 簡単に上記のように記述したプログラムがあるのですが、コンパイラの警告はまったくかかりませんでしたが、関数の中のprintfがdosプロンプトに出力されないのですよ。だれか心あたりがありましたらおしえてもらえないでしょうか? お願いいたします。

  • Nickee
  • お礼率79% (107/134)

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.9

出力できるようになったのですね?ヨカッタヨカッタ! 原因が分からない事なんて多々あります(笑) そのうち原因に気が付くこともあるしね。 とりあえずmarkの位置修正などでソースとのにらめっこなどが続くと思います。 頑張ってください。

Nickee
質問者

お礼

どうも今までありがとうございました。

その他の回答 (8)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.8

 うーん、、、Nickeeさんのソース丸々コピーして、divide()とcall_di()だけコメントにして実行したら、ちゃんと動きましたよ?(全角SPは消しましたが…) OSはWin98、コンパイラはBorland C/C++ 5.5です。 ↓これが使用したテストデータです。 あいうえお\n さしすEOF ↓これが実行結果です。(DOS窓よりコピーしました) ここからあいうえお ここからさしす ・Nickeeさんの方の実行結果の画面って、どうなってます?できたらDOS窓のコピーをお願いします。 ・とりあえずresult()以外の2つの関数呼び出しをコメントにして、↑のような超単純データでテストしてみてもらえますか? ・またresult()の代わりにputs(str)を実行してみてもらえますか? #要求ばかり多くてゴメンなさい。。 以上、よろしくお願いします。

Nickee
質問者

お礼

????????????????????????????? ( ? 0 ? ) なんか、いわれたとおりに、コメントにしたら、出力ができて、コメントを消してもう一度実行したら、プログラムが動きました。ちょっと、markの位置が微妙にづれていましたが。。。 うーーん?なぜ? putsもうごきました。 とりあえず、直ったのでいいのですが、とりあえず、これで、締め切りたいのですが、leaz024さんにこれまで、付き合ってもらって、一方的に切るのは悪いと思いましたので、leaz024さんのご意見を聞かせてもらってから、切ろうと思います。 もし、なかったら、"ない"でもよろしいので。 ちなみに、僕は、原因がわかりません。メモリとか、関係あるんですかね。。

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.7

 コンパイルでエラーが出たということですが、もしかしてNo.5のサンプルから、コピーしたりしました?  サンプルはブラウザでの見栄えをよくするために、半角スペースやタブを使うところを「全角スペース」で書いています。文字列内などでない場所で全角文字を使用すると、「無効な文字がありました」のようなエラーになります。  お使いのテキストエディタに「全角スペースを何らかの記号で表示する機能」などがあれば、有効にしておく便利ですよ。  またソース全体を選択し、「全角スペース→半角スペース2個」の置換を実行してみるとよいでしょう。 #もし上記が見当違いの回答だとしたら、次の補足をお願いします。 >rewindを使用したら、コンパイルエラーがでて このときに追加したコードを、そのまま見せていただけますか? >rewindだけをけして とは、どのようなことをされたのでしょうか?

Nickee
質問者

補足

どうやら、コンパイラエラーは全角スペースが原因だったようです。leaz024さんのいうとおり、コピーをしてはりつけてしまいましたから。。 まだ、rewindをsetvbufをつかっても出力されないんですよ。もう、お手上げです。 下記にソースプログラムをのせておくので、leaz024さんもお忙しいと思われるので、暇で、気が向いた時でよろしいのですので、目を通してもらえれば、幸いです。結構長いので。。。 ちなみに、このプログラムは、あるテキストからdictionary.txtにある文字を探して、その部分だけ、||で囲もうとしたものです。文字はすべて、全角をいう設定で。 #include <stdio.h> #include <string.h> #include <stdlib.h> int mark[100]; char str[200]; char com[10][200][20]; char moji[100]; void divide(void); void call_di(void); void compare(char *moji); void result(void); /*======================================================================*/ int main(int argc,char *argv[]){   FILE *stream; int i=0,k,num; for(i=0;i<=99;i++) mark[i]=0; setvbuf(stdout,NULL,_IONBF,0); if(argc!=2) { printf("使用法:<プログラム名><ファイル名>\n"); exit(1); } if((stream=fopen(argv[1], "r"))==NULL){ printf("can't open\n"); exit(1); } while(!(i==EOF)){ num=0; while((i=fgetc(stream))!='\n'){ if(i==EOF) break; str[num]=i; num++; } str[num]=NULL; str[num+1]=NULL; divide(); call_di(); result(); printf("\n"); } fclose(stream); return 0; } /*======================================================================*/ void divide(void){ int k,num,m; for(k=1;k<11;k++){ for(num=0;num<strlen(str)/2;num++){ for(m=0;m<k*2;m++){ com[k][num][m]=str[num*2+m]; } com[k][num][m+1]='\0'; } } } /*======================================================================*/ void call_di(void){   FILE *stream2; int i,num=0; if((stream2=fopen("dictionary.txt","r"))==NULL){ printf("can't_open_error\n"); exit(1); } while((i=fgetc(stream2))!=EOF){ moji[num]=i; if(moji[num]=='\n') { moji[num]=NULL; num=-1; compare(moji); } num++; } fclose(stream2); } /*======================================================================*/ void compare(char *moji){ int i; for(i=0;i<strlen(str)/2;i++){ if(strcmp(moji,com[strlen(moji)/2][i])==0){ mark[i]=1; mark[strlen(moji)/2+i]=1; } } } /*======================================================================*/ void result(void){ int i; /*ここからの出力ができない*/ printf("ここから"); for(i=0;str[i]!='\0';i=i+2){ printf("%c%c",str[i],str[i+1]); if(mark[i/2]) printf(" | "); } rewind(stdout); }

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.6

>>memset(str, '\0', strlen(str));  /* これしないと、まずくない? */ >これは文字列の最後にNULLをいれるということでしょうか?いちおう、単純にstr[n]=NULL;ってしてあります.  例には書いてないだけで、他の雑用的な処理はなされているのですね。もしかしたら、その延長で処理してあるのかも知れませんが、一応気になったので・・・   str[n] = NULL;  これって、main関数内の処理の方にあるってことですよね? kansuu1内では、strの中を1個おきにしか調べていないので、奇数番目にヌルが入っていると、そのままループが継続されてしまう可能性があります。 (前回の入力よりも入力した文字数が少なく、文字列長が奇数の場合)  kansuu1の処理が3個単位になっても、1個単位になってもOKなように、2個のヌルを入れるのではなく、memsetでクリアするようにしてみました。  それからヌルの使い方なんですが、ヌルを表すNULLと'\0'には   ・NULL … 無効ポインタ   ・'\0' … 文字列の終端記号 という、意味の違いがあります。 (Cでは   #define NULL ((void *)0) という処理系もあるので、この場合は'\0'とは全くの別物です。)  使ってしまえばどちらも0なので問題はないのですが、人にソースを公開する場合には解読の助けにもなるので、このような使い分けは大事ですよ。 (特に集団開発などでは、人のコードを読まされる場合なんて多々あります。)

Nickee
質問者

補足

すいません何度も。。 rewindを使用したら、コンパイルエラーがでて、 不正な文字 'character' (0x'value') 入力ファイルの中に無効な文字がありました。 その文字の 16 進値が出力されます。 これは,関数マクロに余分な引数が渡されたことが原因であることもあります。 .....なんて警告がでてしまい、しまったとおもって、rewindだけをけして、もう一度コンパイルしたら、この警告が消えなくなってしまいました。何か思い当たるふしがあるようであれば、もう一度アドバイスを願いたいのですが。。

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.5

 そもそもコンパイラの警告やエラーというのは   ・プログラム自体が間違っている場合    (セミコロン抜けや括弧の不整合、文法ミスなど)   ・間違いではないが、プログラマのミスではないかと思われるような記述を見つけた場合    (ifやwhileなどの条件式内で、代入のみが行われているなど) などに発せられるもので、動作の不具合を教えてくれるものではありません。 (このような実行時の不具合を一般に「バグ」と呼びます。バグを警告してくれるコンパイラなんてあったら、世の中つまんなくなっちゃうでしょ?)  で本題ですが、a-kumaさんがおっしゃられているように、printf関数の出力先である「標準出力(stdout)」は、デフォルトでバッファリングを行うように設定されています。  バッファリング付き出力先に対して出力を行う際は、バッファが満タンになるか、改行('\n')が出力されるかまで、実際の出力は行われません。  途中途中で改行してやるのがベターなのですが、スクロールできないDOS窓プログラムなので、大量の情報を表示するために改行をしていないのでしょう。  こういう場合、バッファリングを切ったりするのも手なんですが、バッファリングを切らずに、しかも改行しないで出力を実行させる関数があります。  【書式】    #include <stdio.h>    void rewind(FILE *fp);  この関数を使えば、その時点でバッファの中身が出力先デバイスに送られます。 引数には、<stdio.h>内で定義されているstdoutを指定すればOKです。  例のリストは少し見にくかったので、少々手直しをしたサンプルを載せておきます。 #include <stdio.h> #include <string.h> /* main()内部 */      :   do {     n = fgetc(stream);     if (n != EOF && n != '\n') {       str[num++] = (char)n;     } else {       kannsuu1();       kannsuu2();       num = 0;       memset(str, '\0', strlen(str));  /* これしないと、まずくない? */     }   } while (n != EOF);      : /* kansuu1()内部 */      :   printf("表示されない?");   for (i = 0; str[i] != NULL; i += 2) {     printf("%c%c", str[i], str[i+1]);   }   rewind(stdout);    /* この関数実行後、画面に出力される */      :  とりあえずはrewindの行を追加するだけでも動きますので、お試しください。

Nickee
質問者

補足

memset(str, '\0', strlen(str));  /* これしないと、まずくない? */ これは文字列の最後にNULLをいれるということでしょうか?いちおう、単純にstr[n]=NULL;ってしてあります. とりあえず,rewindをつかってみます。ありがとうございました。

  • selenity
  • ベストアンサー率41% (324/772)
回答No.4

まず、コンパイル環境くらいは書きましょう。 32bit Windowsなら「Win32コンソール」アプリ ケーションにすればprintfの出力が見れます。 「関数のプロトタイプ宣言」が先であることは 分かっていますよね。 それと、 while(!(i==EOF)){  num=0;  while((i=fgetc(stream))!='\n'){ の使い方はあまり感心しません。 通常File I/Oでは  while((i=fgetc(stream))!=EOF){   //必要な処理を書く  } の様に書くのが普通ではないでしょうか? 今回のケースだと、  num=0;  while((i=fgetc(stream))!=EOF){   if(i=='\n'){    kannsuu1();    kannsuu2();    num=0;    //ここでstr[]の中身をpaddingする必要がある   }   else{    str[num]=(char)i;    num++;   }  }  if(num>0){//これがないと最後の1行が処理されない   kannsuu1();   kannsuu2();  } の様になるでしょう。

Nickee
質問者

補足

 コンパイルの環境って。うーん、よくわかりませんけど、OSはwin98でBorlandの TurboC++をインストールしています。  関数のプロトタイプ宣言もちゃんとしています。 >while(!(i==EOF)){  num=0;  while((i=fgetc(stream))!='\n'){ の使い方はあまり感心しません。 通常File I/Oでは  while((i=fgetc(stream))!=EOF){   //必要な処理を書く  } の様に書くのが普通ではないでしょうか? いや、一行づつ処理をしたかったので。。。 >今回のケースだと、  num=0;  while((i=fgetc(stream))!=EOF){   if(i=='\n'){    kannsuu1();    kannsuu2();    num=0;    //ここでstr[]の中身をpaddingする必要がある   }   else{    str[num]=(char)i;    num++;   }  }  if(num>0){//これがないと最後の1行が処理されない   kannsuu1();   kannsuu2();  } うーーーん、プログラムの処理のしかたが違っているような気がする。。 参考にさせてもらいます。ありがとうございました。

  • aaaaa
  • ベストアンサー率40% (4/10)
回答No.3

int main(void){ ....   while(!(i==EOF)){     while((i=fgetc(stream))!='\n'){       if(i==EOF) break;     }     kannsuu1();   }   return 0; } void kannsuu1(void) {   printf("出力されない"); } 勝手にまとめさせてもらうとこんなプログラムになりますが これで”出力されない”が出力されないなら 素人の私では回答できません。 もしよかったら このプログラムがどのように終了するのか 教えてください。

Nickee
質問者

お礼

int main(void){ ....   while(!(i==EOF)){     while((i=fgetc(stream))!='\n'){       if(i==EOF) break;     }     kannsuu1();   }   fclose(stream);    return 0; } void kannsuu1(void) {   printf("出力されない"); } って具合で同じなのですけれど、勉強不足のため、どのようにプログラムが終了するかっていうのが、わからないのですけども。  たとえを書いてもらえるわかるのですが。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

「出力されない」というのは、その関数を呼び出したタイミングで、ということ なのでしょうね。 printf() は、普通、出力をバッファリング、つまり、関数の中で一時貯めておきます。 その貯めた中身を吐き出す、つまり、出力するのは、バッファが一杯になるか、改行(\n)に 当たったときです。 「dosプロンプトに」とあるので、勝手に Visual C/C++ だと想像しますが、関数の リファレンスに書いてあります。 これを避けるためには、方法はふたつ。 ひとつは、バッファリングされていない stderr を使うこと。printf() を fprintf(stderr, ...) に置き換えます。 もうひとつは、setvbuf() 関数を使って、バッファリングをしない指定をすること。 stdout に対して、バッファリングしない指定 _IONBF を指定します。 詳細は、関数のリファレンスを見て欲しいのですが、多分こんな感じの関数呼び出しを 最初に一発だけしておけば良いです。   setvbuf(stdout, NULL, _IONBF, 0); バッファリングをしない指定なので、バッファのアドレスやそのサイズは、 NULL と 0 を指定しておけば良いです。

Nickee
質問者

お礼

 うーーん、わからない、何をいっているのか。。まあ、一行ずつ解読しつつ、読み進めていきます。ありがとうございました。

  • kee
  • ベストアンサー率13% (63/457)
回答No.1

printfの中に\nの改行マークを入れてないというのはどうでしょうか? 古い、unixならためておくこともあると思います。 あと、13行目のreturnの後ろに}で閉じてないのは、 省略しているだけですよね。

Nickee
質問者

お礼

windowsなので、13行目はわすれていました。参考にさせてもらいます。ありがとうございました。

関連するQ&A

  • C言語による簡易電卓の作成

    四則演算に加えてべき乗、階乗を使えるような電卓を作りたいのです。 四則演算は #include <stdio.h> #include <ctype.h> void Factor( int *x ); void MulDiv( int *x ); void AddSub( int *x ); int expression( void ); int main( void ) { printf( "%d\n", expression() ); return 0; } void Factor( int *x ) { int num = 0, flag = 1, c = 0; c = fgetc( stdin ); if( c == '-' || c == '+' ){ c = fgetc( stdin ); flag = (c == '+' ) ? 1 : -1; } if( isdigit(c) ){ int n = 0; while( isdigit(c) ){ n = n * 10 + ( c - '0' ); c = fgetc( stdin ); } num = n * flag; }else{ if( c == '(' ){ num = expression(); if( fgetc( stdin ) != ')' ){ exit(-1); } c = 0x0100; } } if( c != 0x0100 ) ungetc( c, stdin ); (*x) = num; } void MulDiv( int *x ) { int num = 0, c = 0; Factor( x ); num = (*x); c = fgetc( stdin ); while( c == '*' || c == '/' || c == '%' ){ switch( c ) { case '*': Factor( x ); num = num * (*x); break; case '/': Factor( x ); num = num / (*x); break; case '%': Factor( x ); num = num % (*x); break; } c = fgetc( stdin ); } ungetc( c, stdin ); (*x) = num; } void AddSub( int *x ) { int num = 0, c = 0; MulDiv( x ); num = (*x); c = fgetc( stdin ); while( c == '+' || c == '-' ){ switch( c ) { case '+': MulDiv( x ); num = num + (*x); break; case '-': MulDiv( x ); num = num - (*x); break; } c = fgetc( stdin ); } ungetc( c, stdin ); (*x) = num; } int expression( void ) { int x = 0; AddSub( &x ); return x; } これで正しく動くことを確認できたのですが、階乗、べき乗の書き方が全くわかりません。どなたか、詳しい方いらっしゃいましたら、ご教授願います。

  • ファイル

    AからZまでの文字が何回出力されるか数えるプログラムなのですが、うまく出力されません。 どこを変えればよろしいでしょうか。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int count[26]; int main(void) { char str[100] = "xyzYZZ\n"; FILE *fp; char *p; int i; char ch; if((fp = fopen("myfile","w")) == NULL){ printf("ファイルを開くことが出来ません"); exit(1); } p = str; while(*p){ if(fputc (*p,fp) == EOF){ printf("ファイル書き込みエラー"); exit(1); } p++; } fclose(fp); if((fp = fopen ("myfile","r")) == NULL){ printf("ファイルを開くことが出来ません"); exit(1); } while((ch == fgetc(fp)) != EOF){ ch = toupper(ch); if( ch >= 'A' && ch <='Z' ) count[ch - 'A']++ ; } for( i=0 ; i<26 ; i++) printf("%c は %d 回出現\n",i + 'A', count[i]); fclose(fp); return 0; }

  • C言語

    文字列を逆順にするプログラムを考えているのですが分かりません。(例)qwerならrewqです。入力終了は、EOFです。考えたのですが、分かりません。(コンパイルエラーです。)教えてください。宜しくお願いします。#include <stdio.h> unsigned str_length(const char str[]) { unsigned len=0; while (str[len]) len++; return (len); } void put_rstring(const char str[]) { unsigned i = str_length(str): while (i-- >0) putchar(str[i]); } int main(void) { char str[30]; int ch; printf("文字列を入力\n"); /* ----この文字列を入力したあとに、Ctrl+Zを押すと、逆から表示               で反対から、文字列が表示----*/ while (1) { ch=getchar(); if (ch==EOF) break; } printf("逆から表示"); put_rstring(str); puts("です。"); return(0); }

  • printf()で出力したいんですが?

    #include <stdio.h> int main( void ) { int air[4]; int i; i = 0; printf( "データ入力\n" ); do{ scanf( "%d\t", &air[ i++ ]); } while(air[ i - 1 ] > 0 ); printf( "%d\n", i ); return 0; } このプログラムはコンパイル出来ますが、期待していたprintf関数での出力ができません。 その理由として何がありますか?関数の使い方が間違っているのか、DO~WHILE文が使えない場所 なのか、もし直すとすればどう直せばいいのですか。

  • printf scanf が、反応しません。

    printf scanf が、反応しません。 #include <stdio.h> int main(void) { int num = 0; int sum = 0; printf("テストの点数を入力してください。(0で終了)\n"); do{ scanf("%d", &num); sum += num; }while(num); printf("テストの合計点は%d点です。\n", sum); return 0; } C:\WORK>gcc test1.c C:\WORK>gcc -o test1 test1.c おかしいです。 打開策を教えてください。 ご多忙中恐れ入ります。 ご回答のほど、宜しくお願い申し上げます。

  • C言語に詳しい方、ご指導をお願いします。

    C言語を今勉強しています。 ある調べたい数値を入力して、txtの中に入っている数字(10000までの素数)を読み込み、その素数たちを利用して素因数分解しようとしています。 しかし、何度試しても読み込みだけしか行われず、 調べたい数値を入力することすらできません。 どこに問題があるのでしょうか、ぜひご指導をお願いします。 今作成しているプログラムです。 #include<stdio.h> void main(void) {int i,k,num,p[10000]; {for(i=0;scanf("%d",&p[i])!=EOF;i++){} num=i; } printf("素因数分解したい整数は?\n"); scanf("%ld",&k); printf("%ld=",k); while(p[i]<=num) { for(i=0;p[i]<=num;i++) {if((k%p[i])==0) {printf("%ld*",p[i]); k=k/p[i]; break; } } } printf("%ld\n",k); } txtの中身 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71             ・             ・             ・ 9817 9829 9833 9839 9851 9857 9859 9871 9883 9887 9901 9907 9923 9929 9931 9941 9949 9967 9973

  • 分割した単語の頻出頻度を表示させたい

    英文テキストファイルを読み込み、分割した単語の頻出頻度を表示するプログラムを作成しています。 現時点では、分割した単語の表示しかできていません。 どなたか良きアドバイスをお願いします。 #include <stdio.h> int main() { int i,key,len,num ; int sp=0; char str[100000],*ptr[100000] ; FILE *fp; if ((fp=fopen("test.txt","r"))==NULL) { return -1; } num = 0 ; len = 0 ; ptr[0] = str ; do { key = fgetc(fp); str[len] = (char)key ; if ( (key==' ' && sp==0) || key == '.' || key == ',' || key == '!' || key == '?' || key == '"' || key == 0x0a || key == 0x0d ){ str[len] = '\0' ; if ( str+len-ptr[num] ){ num ++ ; } ptr[num] = str+len+1 ; if( key==',' || key=='.' || key== '!' || key=='?' || key=='"'){ str[++len]=(char)key; str[++len]='\0'; ptr[++num]=&str[len+1]; } } sp= (key== ' ')?1:0; len ++ ; } while ( key != EOF && len < 255 ); str[255] = '\0' ; for (i=0 ;i<num ;i++){ printf("%s\n",ptr[i]); } fclose(fp); return i; }

  • C言語でファイルの内容を strtok関数 を使って数字と文字を分けて

    C言語でファイルの内容を strtok関数 を使って数字と文字を分けて配列に格納したいのですが、うまくできません。 どこが駄目なのかご指摘をお願いします! ファイル内容 20 田中 10 鈴木 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc,char *argv[]) { FILE *fp; char str[256]; char *tp; int i=0; int num[10]; char na[10]; fp=fopen(argv[1],"r"); while(fgets(str,sizeof str,fp)!=NULL); tp = strtok ( str, " " ); while(tp != NULL ) { num[i]=atoi(tp); tp = strtok( NULL," "); if ( tp != NULL ){ na[i]=*tp; } i++; } printf("%d\n%s",num[0],na[0]); printf("%d\n%s",num[1],na[1]); fclose(fp); return 0; }

  • またまたテストの復習なんですが・・・

    処理内容 基数、および変換対象数値(10進数)を入力させ、それに応じた基数変換を行う。その結果を画面に出力する。 ソースプログラム #include<stdio.h> #define MAX_OUT (16) int InputNum(int, int); char ChangeNum(int); /* メイン処理 */ main(){ int i; /* カウンタ */ int num; /* 対象数値 */ int num_base /* 基数 */ int num_next, num_out; char str[MAX_OUT]; /* 変換後文字格納用 */ while (1){ printf("基数を入力してください(2~32)\n"); printf("(2~32以外の入力で終了)\n"); num_base=InputNum(2,32); if (-1==num_base) { break; } printf("対象の数値を入力してください(0~65535)\n"); printf("(0~65535以外の入力で終了)\n"); num=InputNum(0,65535); if (-1==num) { break; } /* 変換開始 */ ( 1 ) for (i=0; i<MAX_OUT; i++){ /* 変換終了か判定する */ if (num_base>num_next){ /* 変換後文字の格納 */ str[i++]=ChangeNum(num_next); break; } /* 数値文字を抽出 */ num_out=( 2 ) str[i]=ChangeNum(num_out); /* 次の行へ */ num_next=( 3 ) } /* 変換結果を出力 */ printf("対象数値%dの%d進数表現は\n",num, num_base); for (i -= 1; 0<=i; i--) { printf("%c", str[i]); } printf("\nです\n"); } printf("終了します\n"); } /* 数値入力処理 */ int InputNum(int min, int max){ int ret; scanf("%d", &ret); if ((min>ret) || (max<ret)){ ret=-1; } return ret; } /* 数値を文字に変換 */ char ChargeNum(int num){ char ret=0; if (10>num){ ret=num+'0'; } else{ ret=( 4 )+'A'; } return ret; } という問題なんですが、(1)~(4)の答えと説明をどなたかして頂けないでしょうか?どうぞよろしくお願いします!ちなみにwhile(1)は無限ループです。

  • ポインタ配列

    ポインタ配列によるひとつのプログラムを組もうと思っています。 で、以下のようなプログラムを作ってみました。 1:#include<stdio.h> 2:#define NUM 5 3:main(void){ 4: char *str[NUM]; 5: int i; 6: for(i=0;i<NUM;i++){ 7: printf("string --->"); 8: scanf("%s",str[i]); 9: } 10: for(i=0;i<NUM;i++){ 11: printf("str[%d] --> %c\n",i,str[i]); 12: } 13:} これなのですが、8行目のscanf文でコンパイルエラーではなく、実行エラーが出ます。どのようにすれば動くようになるのでしょうか? 入力する文字は、9文字以下を想定しています。