- 締切済み
C言語を使ったプログラム作成
ご教授お願い致します。 void main() { char *pt[3]; char member[][6]={{'C','a','n','d','y','\0'}, {'N','a','n','c','y','\0'}, {'E','l','u','z','a','\0'}, }; pt[0]=member[0]; pt[1]=member[1]; pt[2]=member[2]; printf("[%c %c %c]\n",(*pt[0]++),*(pt[1]++),*(pt[2]++)); } 実行結果 [C N E] [a a l] [n n u] [d c z] [y y a] となるのですが以降文字がないところはスペースにするにはどうすればいいでしょうか。 例 実行結果 ※△=スペース [C△N△ E] [a△a△l] [n△n△u] [d△c△z] [y△y△a] [1△1△1] [2△2△△] [3△△△△] [△△△△△] [△△△△△]
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- jagd-doga
- ベストアンサー率31% (14/45)
プログラムの書き方なので、やりようはいくらでもあるのですが 「以降文字がないところはスペースにする」のか、 例の実行結果のようになればよいのか、で答えは変わってきます。 ●以降文字がないところはスペース for( int cnt = 0 ; cnt < 10 ; cnt++ ){ printf("[%c %c %c]\n", ((cnt < strlen( menber[0] ))? member[0][cnt] : '△' ), ((cnt < strlen( menber[1] ))? member[1][cnt] : '△' ), ((cnt < strlen( menber[2] ))? member[2][cnt] : '△' )); } ●例の実行結果にする #define LENGTH 10 char member[][LENGTH + 1]={ {'C','a','n','d','y','1','2','3','△','△','\0'}, {'N','a','n','c','y','1','2','△','△','△','\0'}, {'E','l','u','z','a','1','△','△','△','△','\0'}, }; for( int cnt = 0 ; cnt < LENGTH ; cnt++ ){ printf("[%c %c %c]\n", member[0][cnt],member[1][cnt],member[2][cnt]); } ※たぶん合ってると思うけど「えいっ」て書いたので動くかは保証できません。 ここで注意しなければならないのは、 char member[][6] と宣言したところに対して、 printf( "%c %c", member[0][6],menber[0][7]); という参照のしかたは危険だということです。 つまり、No.1、No.4の方のプログラムは危険だと言っています。 No.1の方が言うように、配列の6以降の要素はシステムに依存しますが、 配列が割りつけられた場所によっては、読むことが出来ない領域である可能性があります。 Read access violationでExceptionが発生し、プログラムが異常終了する事もないとは言えません。 もっとも、この配列は関数の自動変数で宣言しており、スタック上に配置されますので、Read Access violation になる事は考えづらいですが。 要するに char member[6] と宣言したら、 menber[5] までの参照にした方が安全だということです。
- Quant
- ベストアンサー率18% (23/122)
void main() { char *pt[3]; char member[][6]={{'C','a','n','d','y','\0'}, {'N','a','n','c','y','\0'}, {'E','l','u','z','a','\0'}, }; int i; pt[0]=member[0]; pt[1]=member[1]; pt[2]=member[2]; for(i = 0;i < 10;i++) printf("[%c %c %c]\n",(*pt[0] == '\0') ? ' ': *pt[0]++,(*pt[1] == '\0') ? ' ': *pt[1]++,(*pt[2] == '\0') ? ' ': *pt[2]++); }
- popombmb1013
- ベストアンサー率11% (2/18)
プログラム作成の第一歩は「エディタを使ってのプログラム作成」です。要はC言語の命令文を記述してファイルを作るわけです。 エディタで作成したファイルの拡張子は「.c」になり、このファイルを「ソースプログラム」と呼びます。「sample」という名前でプログラムを作るとすると、そのソースプログラムは「sample.c」になります。 エディタは何でもかまいません。WZ、秀丸、Vi、メモ帳 …。自分の使いやすいエディタを使ってください。 ソースプログラムは人間が自分たちにわかるようにコンピュータ言語で記述したものなので、コンピュータはこのソースプログラムを直接理解することができません。コンピュータに理解させるためには、「コンパイル」という機械語への翻訳が必要になります。翻訳された機械語は「オブジェクトモジュール」と呼ばれ、Windows上で動作する Cコンパイラでは、ファイルの拡張子は「.obj」が多くなります。 C言語のコンパイルは Cコンパイラで行われます。 1972年に開発されたC言語ですが、長い間に多くの企業で開発が進み、今ではたくさんの Cコンパイラが用意されています。この Cコンパイラに応じて、たくさんのC言語が存在しています。OSにWindowsをお使いの方でしたら、以下のようなコンパイラを使うとよいでしょう。 無料のコンパイラ : LSI C-86 試食版 Borland C++ Compiler 5.5 (注1) 無料の統合開発環境 (注2) : Visual C++ 2005 Express Edition Turbo C++ Explorer (注1) C++ は C言語をオブジェクト指向に拡張した言語であり、C言語のソースプログラムをコンパイルすることが可能です。 (注2) 統合開発環境とは、エディタ、コンパイラ、デバッガ(プログラムの誤りの発見や修正を行うソフトウェア)など、プログラミングに必要なツールがすべて揃っている環境のことです。
- asuncion
- ベストアンサー率33% (2127/6289)
実行結果例にある、 1 2 3 の入力データはどこにあるのですか?
- LHS07
- ベストアンサー率22% (510/2221)
実行結果は [C N E] しかならないと思います。 #include<stdio.h> void main() { char *pt[3]; char member[][6]={{'C','a','n','d','y','\0'}, {'N','a','n','c','y','\0'}, {'E','l','u','z','a','\0'}, }; int i; pt[0]=member[0]; pt[1]=member[1]; pt[2]=member[2]; for (i=0;i<11;i++) { printf("%d [%c %c %c]\n",i,(*pt[0]++),*(pt[1]++),*(pt[2]++)); }; } 実行結果はコンパイル環境によって6以降の文字はシステムに依存するのですが 1バイト分、整数として表示します。 i<11 を変更するしかないと思います。