- ベストアンサー
C言語の仕組み
C言語の仕組み printfという命令で画面に文字を表示できますが、文字が表示される画面はMS-DOSの画面や開発プログラムの実行ウィンドウの中ですよね。 もしC言語がPCに直接命令できるのであれば、画面全体が真っ暗になって、そこに文字が表示されるべきなのではないかと思いました(つまり、OS上で動くべきではない)。 しかし、仮に全く最初から文字を打つとしたら、ディスプレイの仕組みを理解して、ドットで文字を表示させなければなりません。 いったいprintfというのはどこに対して命令しているものなのでしょうか
- lu-mu-
- お礼率43% (62/144)
- C・C++・C#
- 回答数7
- ありがとう数14
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
誤解があるようですが、printf関数は『画面には出力していません』 正確には「標準出力」と呼ばれる出力装置へ文字列を出力する関数です。 その「標準出力」が、DOS窓だったり実行ウィンドウだったりするので、それぞれの画面に出力しているように見えるだけです。 リダイレクト機能を使って 「コマンド > file.txt」とすれば「標準出力」は file.txtというファイルになるし パイプ機能を使って「コマンドA | コマンドB」とすれば、コマンドAの標準出力先はコマンドBの「標準入力」になります。 これらの動作はOSを通して行うものです。 >OS上で動くべきではない というのは大きな考え違いです。 ついでに言えば、scanfやgetc等もキーボードからではなく「標準入力」から入力する関数です。 以上は、Cの標準ライブラリの「標準入出力関数」を使った場合の話。 自前で「直接画面に出力するprintf関数」を作成した場合はこの限りではありません。 printfはあくまで「標準ライブラリに含まれる関数」であって、「C言語」の一部ではないのです。
その他の回答 (6)
- jacta
- ベストアンサー率26% (845/3158)
自分でprintfを実装するか、せめて既存のprintfのソースコードを読むのが理解への一番の近道です。
お礼
なるほど。どうやってやるのか調べてみます
- BuriBuri4
- ベストアンサー率28% (150/525)
printf( )は《標準出力(stdout)》に出力を行う関数であり《画面》に出力する関数ではありません。 stdoutは通常はデバイスではなくOSが管理するストリームです。 標準出力(stdout)はプログラム実行時にOSが割り当てます。 例えば test.exeを実行する際に test.exe > wotk.txt とすれば printf( )の出力先は画面ではなくwork.txtファイルになります。 OSを持たない小規模な組み込み系システムの場合はprintf( )自体がデバイスへの出力として実装されている事もあります。
お礼
ありがとうございました
- gungnir7
- ベストアンサー率43% (1124/2579)
どの言語もそうですが、OS上で動くにはOSにコマンドを認識させる必要があります。 それがネイティブのコードかインタプリタを介するかで大きく2つに分かれます。 C言語は前者、JAVAや.Net Basicなどは後者になります。 C言語の場合はソースをCコンパイラがネイティブな機械語に変換します。 コンパイラがOSに理解できるように変換してくれます。 ディスプレイの仕組みを理解して・・・という部分もコンパイラが担当します。
お礼
ありがとうございました。
- notnot
- ベストアンサー率47% (4848/10262)
入門書に載っていたり、学校で習ったりするCは、「OSの上で動くC」です。 Windows上で動くCならprintf関数は最終的にWindowsの文字出力APIを呼び出します。 「OSの上で動かないC」もあります。「スタンドアローン環境」とか呼ばれる。printfとかは使えず、ハードウェアを直接制御することになります。
お礼
ありがとうございました。
- zwi
- ベストアンサー率56% (730/1282)
実際のコンパイラ自体の実装によります。 Windows用の例えばVC++であればprintf関数ライブラリがWindowsAPIを使ってコンソールに文字を出力する処理を行っています。 Linuxで動いているgccとかであれば、printf関数ライブラリはLinuxのAPIに対してコンソール出力をするためのコードが書かれています。 マイコン等だと、printfがRS232cに出力するprintf関数ライブラリがあるかと思えば、printfがちゃんと実装されていない(使えない)コンパイラもあるわけです。 printf関数もC言語で書かれたプログラムに過ぎません。なので、環境に依存した部分は、それ専用の処理が書かれていると思ってもらって良いと思います。 >しかし、仮に全く最初から文字を打つとしたら、ディスプレイの仕組みを理解して、ドットで文字を表示させなければなりません。 もし、その環境専用なのであれば専用のライブラリが提供されることになります。
お礼
ありがとうございました。
- x1va
- ベストアンサー率26% (802/3006)
> いったいprintfというのはどこに対して命令しているものなのでしょうか OSに対して行います。 > 仮に全く最初から文字を打つとしたら、ディスプレイの仕組みを理解して、ドットで文字を表示させなければなりません。 コンパイルの際に、OSがもつ機能を呼び出してそれを実現するようにしているのです。 OSの役割の一つが、ある程度の基本機能を提供しておいて、ユーザプログラムはそれを利用するだけで作れるようにしておくことにあります。
お礼
ありがとうございました
関連するQ&A
- c言語でできること
c言語は具体的には何ができるのでしょうか ものすごくがんばれば市販のゲームソフトなども作れるようになるのでしょうか というのは 今、僕はc言語のプログラミングを勉強しています コンパイルするとms-dosの黒い画面が表示されますよね。オセロなどのゲームはとても見にくいです。 あのようなゲームではなく、ちゃんと絵があるようなゲームは作れるのでしょうか?? また3Dのゲームはつくれるのでしょうか? 「c言語のゲーム」とググってもありません c言語だけではできなくてdirectxなどがいることは知っています。 プログラミングを学ぶ上でなにか目標ができたら それに向けてがんばれると思うので情報よろしくお願いします。 わかりにくい文章ですいません^^;
- ベストアンサー
- C・C++・C#
- DOS画面でテキストカーソルの位置を移動する(C言語)
DOS用のC言語プログラムを作っています。そこで printf関数などで文字列を表示した後表示した文字列の 間に違う文字列を挿入したりしたいのですがそんなことは 可能でしょうか? #include <stdio.h> int main(void){ printf("13456789"); printf("2"); return 0; } というプログラムを作ったとして1と3の間に割り込んで2と 入れたい場合どうしたらよいでしょうか? 開発環境はwindowsXPでコンパイワはBorlandです。
- ベストアンサー
- C・C++・C#
- C言語超初心者です。
C言語を始めたばかりで、レベルの低い内容で申し訳ないですが、よろしくお願いします。 コンパイルした文字や文字列などを、コマンドプロンプト上ではなく、画面全体をクリアにして、コンパイルした文字や文字列のみを表示するには、どのようにしたらよいでしょうか? できれば表示する位置を指定する方法も、教えていただきたいです。 使用しているのは、Tera Pad、BorlandC++5.5コンパイラーです。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- MS-DOS画面の最小化
いまVisual C++ .NETでC言語をやっているのですが、 C言語を書いて実行するとMS-DOSの画面が出てくるんですけど実行時プログラム上からMS-DOSの画面を最小化して実行はできないのでしょうか?また、MS-DOS画面の閉じるボタンを非表示にする方法はあるのでしょうか?
- 締切済み
- C・C++・C#
- 【PC98x1/国民機】C言語について
C言語の勉強をしようかと考えているのですが、C言語にも様々な高級言語、開発プログラムが或ります。 其の中で、最新の「C言語」とは何でしょうか。 対応: MS-DOS (NEC) 非対応:Windows でお願いします。
- 締切済み
- その他(OS)
- C言語プログラムの画面消去について
C言語のプログラムで、 system("cls"); を使って画面消去ずることについて質問です。 この消去方法はパソコンが書いたプログラムを上から読み込むときに、system("cls");が書かれている位置まできたときに画面を自動的に消去するものだと聞きました。 例えば、 main() { system("cls"); printf("あいうえお\n"); } と書いたとすると、これをコンパイルしたとき、それまでに書いた「gcc ~~.c」や「./a.exe」などが全て消えて、いきなり画面に「あいうえお」の文字が表示されるのだと思います。 この操作をエンターキーなどで操作したい、つまり、 main() { printf("あいうえお\n"); system("cls"); printf("かきくけこ\n"); } という内容であったなら、まず「あいうえお」を表示させ、自分の好きなときにエンターキーを押して画面を消去し、「かきくけこ」だけを新たに表示させたいです。 このような操作は可能なのでしょうか? 基礎的なことで申し訳ありませんが、ご回答よろしくお願いいたします。
- 締切済み
- C・C++・C#
- c言語 scanf
下のソースを実行したらおかしなことになったんですがなんででしょうか?? #include<stdio.h> int main(void){ int i; char c[1000]; for(i=0;;i++){ printf("文字>>>>"); scanf("%c",&c[i]); printf("result = %c \n",c[i]); } } ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓実行↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 文字>>>>a result = a 文字>>>>result = 文字>>>>b result = b 文字>>>>result = 文字>>>>c result = c 文字>>>>result = 文字>>>>d result = d 文字>>>>result = 文字>>>>^C
- 締切済み
- C・C++・C#
- 皆様に、C言語についての質問です・・><
皆様に、C言語についての質問です・・>< この前も質問しましが、まだできないので>< 後、少し問題にもミスがあったので書き直しました プログラミングの内容は以下のようなものです。 以下の実行結果をもとにプログラミングしなさい。 char m[30]; 実行結果 文字,個数==>A,5 文字,個数==>b,3 文字,個数==>c,1 文字,個数==>E,2 文字,個数==>^Z 文字列:AAAAAbbbcEE ↓は自分でやったプログラムです>< #include<stdio.h> void main(void) { char m[30],moji; int kosu,i; printf("文字,個数==>"); fflush(stdin); scanf("%c,%d",&moji,&kosu); i=0; while(m[i]!=EOF) { printf("文字,個数==>"); scanf("%c,%d\n",&moji,&kosu); m[i]=moji; i++; } m[i]='\0'; printf("文字列:%s\n",m); return; } ^z押しても終了できません>< 表示もおかしいです・・・・ 訂正お願いいたします><
- 締切済み
- C・C++・C#
お礼
標準関数ってそういうことだったんですね。 C言語の最も根元にある関数というふうに捉えていましたが、全然違うんですね。 ありがとうございました。