• ベストアンサー

C言語の仕組み

C言語の仕組み printfという命令で画面に文字を表示できますが、文字が表示される画面はMS-DOSの画面や開発プログラムの実行ウィンドウの中ですよね。 もしC言語がPCに直接命令できるのであれば、画面全体が真っ暗になって、そこに文字が表示されるべきなのではないかと思いました(つまり、OS上で動くべきではない)。 しかし、仮に全く最初から文字を打つとしたら、ディスプレイの仕組みを理解して、ドットで文字を表示させなければなりません。 いったいprintfというのはどこに対して命令しているものなのでしょうか

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

誤解があるようですが、printf関数は『画面には出力していません』 正確には「標準出力」と呼ばれる出力装置へ文字列を出力する関数です。 その「標準出力」が、DOS窓だったり実行ウィンドウだったりするので、それぞれの画面に出力しているように見えるだけです。 リダイレクト機能を使って 「コマンド > file.txt」とすれば「標準出力」は file.txtというファイルになるし パイプ機能を使って「コマンドA | コマンドB」とすれば、コマンドAの標準出力先はコマンドBの「標準入力」になります。 これらの動作はOSを通して行うものです。 >OS上で動くべきではない というのは大きな考え違いです。 ついでに言えば、scanfやgetc等もキーボードからではなく「標準入力」から入力する関数です。 以上は、Cの標準ライブラリの「標準入出力関数」を使った場合の話。 自前で「直接画面に出力するprintf関数」を作成した場合はこの限りではありません。 printfはあくまで「標準ライブラリに含まれる関数」であって、「C言語」の一部ではないのです。

lu-mu-
質問者

お礼

標準関数ってそういうことだったんですね。 C言語の最も根元にある関数というふうに捉えていましたが、全然違うんですね。 ありがとうございました。

その他の回答 (6)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.7

自分でprintfを実装するか、せめて既存のprintfのソースコードを読むのが理解への一番の近道です。

lu-mu-
質問者

お礼

なるほど。どうやってやるのか調べてみます

  • BuriBuri4
  • ベストアンサー率28% (150/525)
回答No.6

printf( )は《標準出力(stdout)》に出力を行う関数であり《画面》に出力する関数ではありません。 stdoutは通常はデバイスではなくOSが管理するストリームです。 標準出力(stdout)はプログラム実行時にOSが割り当てます。 例えば test.exeを実行する際に test.exe > wotk.txt とすれば printf( )の出力先は画面ではなくwork.txtファイルになります。 OSを持たない小規模な組み込み系システムの場合はprintf( )自体がデバイスへの出力として実装されている事もあります。

lu-mu-
質問者

お礼

ありがとうございました

  • gungnir7
  • ベストアンサー率43% (1124/2579)
回答No.5

どの言語もそうですが、OS上で動くにはOSにコマンドを認識させる必要があります。 それがネイティブのコードかインタプリタを介するかで大きく2つに分かれます。 C言語は前者、JAVAや.Net Basicなどは後者になります。 C言語の場合はソースをCコンパイラがネイティブな機械語に変換します。 コンパイラがOSに理解できるように変換してくれます。 ディスプレイの仕組みを理解して・・・という部分もコンパイラが担当します。

lu-mu-
質問者

お礼

ありがとうございました。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.4

入門書に載っていたり、学校で習ったりするCは、「OSの上で動くC」です。 Windows上で動くCならprintf関数は最終的にWindowsの文字出力APIを呼び出します。 「OSの上で動かないC」もあります。「スタンドアローン環境」とか呼ばれる。printfとかは使えず、ハードウェアを直接制御することになります。

lu-mu-
質問者

お礼

ありがとうございました。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

実際のコンパイラ自体の実装によります。 Windows用の例えばVC++であればprintf関数ライブラリがWindowsAPIを使ってコンソールに文字を出力する処理を行っています。 Linuxで動いているgccとかであれば、printf関数ライブラリはLinuxのAPIに対してコンソール出力をするためのコードが書かれています。 マイコン等だと、printfがRS232cに出力するprintf関数ライブラリがあるかと思えば、printfがちゃんと実装されていない(使えない)コンパイラもあるわけです。 printf関数もC言語で書かれたプログラムに過ぎません。なので、環境に依存した部分は、それ専用の処理が書かれていると思ってもらって良いと思います。 >しかし、仮に全く最初から文字を打つとしたら、ディスプレイの仕組みを理解して、ドットで文字を表示させなければなりません。 もし、その環境専用なのであれば専用のライブラリが提供されることになります。

lu-mu-
質問者

お礼

ありがとうございました。

  • x1va
  • ベストアンサー率26% (802/3006)
回答No.1

> いったいprintfというのはどこに対して命令しているものなのでしょうか OSに対して行います。 > 仮に全く最初から文字を打つとしたら、ディスプレイの仕組みを理解して、ドットで文字を表示させなければなりません。 コンパイルの際に、OSがもつ機能を呼び出してそれを実現するようにしているのです。 OSの役割の一つが、ある程度の基本機能を提供しておいて、ユーザプログラムはそれを利用するだけで作れるようにしておくことにあります。

lu-mu-
質問者

お礼

ありがとうございました

関連するQ&A

  • c言語でできること

    c言語は具体的には何ができるのでしょうか ものすごくがんばれば市販のゲームソフトなども作れるようになるのでしょうか というのは 今、僕はc言語のプログラミングを勉強しています コンパイルするとms-dosの黒い画面が表示されますよね。オセロなどのゲームはとても見にくいです。 あのようなゲームではなく、ちゃんと絵があるようなゲームは作れるのでしょうか?? また3Dのゲームはつくれるのでしょうか? 「c言語のゲーム」とググってもありません c言語だけではできなくてdirectxなどがいることは知っています。 プログラミングを学ぶ上でなにか目標ができたら それに向けてがんばれると思うので情報よろしくお願いします。 わかりにくい文章ですいません^^;

  • DOS画面でテキストカーソルの位置を移動する(C言語)

     DOS用のC言語プログラムを作っています。そこで printf関数などで文字列を表示した後表示した文字列の 間に違う文字列を挿入したりしたいのですがそんなことは 可能でしょうか? #include <stdio.h> int main(void){ printf("13456789"); printf("2"); return 0; } というプログラムを作ったとして1と3の間に割り込んで2と 入れたい場合どうしたらよいでしょうか? 開発環境はwindowsXPでコンパイワはBorlandです。

  • C言語超初心者です。

    C言語を始めたばかりで、レベルの低い内容で申し訳ないですが、よろしくお願いします。 コンパイルした文字や文字列などを、コマンドプロンプト上ではなく、画面全体をクリアにして、コンパイルした文字や文字列のみを表示するには、どのようにしたらよいでしょうか? できれば表示する位置を指定する方法も、教えていただきたいです。 使用しているのは、Tera Pad、BorlandC++5.5コンパイラーです。 よろしくお願いします。

  • c言語 ちらつき

    タイトルの通りなのですが現在c言語で簡単なシューティングを作っているのですが、敵を6体表示すると画面全体が激しく点滅を繰り返し(ちらつき?)どうにもなりません。 敵の数を減らす訳にもいかず・・・。どうしたらこの画面がちらつかなくなりますか?

  • MS-DOS画面の最小化

    いまVisual C++ .NETでC言語をやっているのですが、 C言語を書いて実行するとMS-DOSの画面が出てくるんですけど実行時プログラム上からMS-DOSの画面を最小化して実行はできないのでしょうか?また、MS-DOS画面の閉じるボタンを非表示にする方法はあるのでしょうか?

  • 【PC98x1/国民機】C言語について

    C言語の勉強をしようかと考えているのですが、C言語にも様々な高級言語、開発プログラムが或ります。 其の中で、最新の「C言語」とは何でしょうか。 対応: MS-DOS (NEC) 非対応:Windows でお願いします。

  • C言語のプログラムで...

    C言語のプログラムで2つのprintf関数の表示にタイムラグを付ける場合はどうしたら良いでしょうか?

  • C言語プログラムの画面消去について

    C言語のプログラムで、  system("cls"); を使って画面消去ずることについて質問です。 この消去方法はパソコンが書いたプログラムを上から読み込むときに、system("cls");が書かれている位置まできたときに画面を自動的に消去するものだと聞きました。 例えば、 main() { system("cls"); printf("あいうえお\n"); } と書いたとすると、これをコンパイルしたとき、それまでに書いた「gcc ~~.c」や「./a.exe」などが全て消えて、いきなり画面に「あいうえお」の文字が表示されるのだと思います。 この操作をエンターキーなどで操作したい、つまり、 main() { printf("あいうえお\n");  system("cls"); printf("かきくけこ\n"); } という内容であったなら、まず「あいうえお」を表示させ、自分の好きなときにエンターキーを押して画面を消去し、「かきくけこ」だけを新たに表示させたいです。 このような操作は可能なのでしょうか? 基礎的なことで申し訳ありませんが、ご回答よろしくお願いいたします。

  • 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言語についての質問です・・>< この前も質問しましが、まだできないので>< 後、少し問題にもミスがあったので書き直しました プログラミングの内容は以下のようなものです。 以下の実行結果をもとにプログラミングしなさい。 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押しても終了できません>< 表示もおかしいです・・・・ 訂正お願いいたします><