• ベストアンサー

fgetc( )の戻り値はなぜ整数??

fgetc( )は戻り値が整数ですが、あれは何を指しているのでしょう? ポインタに代入すれば値を表示できますが・・・。 EOFを返すために整数なのはわかるのですが・・。 アドレスの値ではないですし、デバックして値をみると、二桁の整数でした。 文字コードかなにかなんですかね・・・。 知っているかたいたら教えてください! よろしくお願いします。

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

  • ベストアンサー
  • ency
  • ベストアンサー率39% (93/238)
回答No.3

回答はすでに出ていますが、補足ということで。。。 要するに、C には「文字」を表す型がないということなんです。 char型は、1バイト長の整数型だと思ってください。 いわゆる半角文字をあらわすのに、アスキーコードでは 0x00~0x7F であらわすことができますので、C ではそれをあらわすのに十分な 1バイトを char型として採用したということです。 しかも、char型の変数にはアスキーコードが数値としてダイレクトに入るので、以下のような処理も可能になっちゃうと。。。 ------------------------------------------------- char hoge; hoge = 'a'; hoge += 10; // hoge は 'k' になる。 ------------------------------------------------- また、以下の処理はすべて同じことのなります。 ------------------------------------------------- char piyo; piyo = 'a'; piyo = 0x61; piyo = 0x97; ------------------------------------------------- …あと、注意が必要なのは、こんな言語は珍しいということですね。 # C って、いろんな意味で手抜きな言語ですからね。 ふつうの言語は「文字型」の変数には「文字」しか代入できません。 ついでに、C で 1文字の「文字」用に変数を用意する場合、int型にしたほうがいろんな意味で良いと思います。 C の標準関数も、1文字を扱う関数は int型を引数にとったり戻り値にしていますよね。 # そもそも、int型より小さいサイズは、実行時にはすべて int型のサイズに変換されてしまいますし。 # このあたりの話は、「汎整数拡張」でご自分で調べてみてください。 (←あ、逃げた。。。) じゃあ、「char型の存在意義は?」という話になりますが、文字列 (char型配列) 用に用意されていると思ってもらって良いのではないかな。 「補足」といいながら長くなってしまいましたが、まとめると以下のような感じかな。 ◆「文字」は int型であらわす (もちろん char型であらわすことも可能)。 ◆「文字列」は char型の配列であらわす。 ご参考まで。

rooney_10
質問者

お礼

やはり、コンピュータはint型が一番処理しやすいんでしょうね。 これから、アスキーコードの課題をやるのでいい勉強になりました。 文字は数字で変えられるんですね驚きました。 どうも細かいところまでありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • Agamemnon
  • ベストアンサー率20% (25/125)
回答No.2

ご存じかとは思いますが、コンピュータは全て数値で動いてます。 文字に見えるものも全て数値なのです。 fprint()関数なども、数値を文字列として表現するだけで、 内部では数値として扱っているわけです。 char 型の変数といっても中身はタダの整数値ですしね。 char 型でループのカウンタを作って動かしてみると分かります。

rooney_10
質問者

お礼

>ご存じかとは思いますが、コンピュータは全て数値で動いてます。 >文字に見えるものも全て数値なのです。 ですね。 処理を行うまでのコンピュータに渡される値は1,0までに なるんですよね。 あんまり型に惑わされないようにします。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.1

> fgetc( )は戻り値が整数ですが、あれは何を指しているのでしょう? > 文字コードかなにかなんですかね・・・ 正解。

rooney_10
質問者

お礼

>正解。 やっぱりですか・・・。 正確なことが本にもサイトにも書いてなかったので。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • fgetc()関数の動作について

    Visual Studio 2008(C++) において↓のようなコードを書いてビルドして、デバッグなしで実行すると、 コンソール上でちゃんとファイルの文字がコンソールに表示されます。 ところで、fgetc()関数のリファレンスを見ると、戻り値がint型を返すと書いてあるのに、 このコードだとchar型のバッファで受けています。char型でもfgetc() 関数の戻り値を受けられる理由がわかりません。 これはやはり、fgetc()がShift-JISコードの文字コード番号そのものを返しているのでしょうか。 (int型の配列で各要素にfgetc()の戻り値をみると、ファイル上の文字の文字コード番号が 入っています。) char型で受けると、文字そのものを受けられるのでしょうか? また、char型で受けた時に、char(1バイト)で、EOF(2バイト)をどうやって格納し、識別しているの でしょうか。 初歩的な質問で申し訳ありませんが、ご回答、よろしくお願いします。 #include <iostream> using namespace std; int main(){ FILE *fin = fopen("testa.txt", "r"); if(!fin){ "入力ファイルをオープンできません。"; return 1; } int i=0; char buf[20]; while((buf[i] = fgetc(fin))!=EOF){ i++; } buf[i]='\0'; cout << buf << endl; return 0; }

  • C言語 exitで終了した関数の戻り値

    引数が負の整数であればエラーを表示し終了、0以上の整数であればそのまま戻り値とする関数 int example(int a) { if( a < 0 ) { printf("Error!\n");   exit(1); } return(a); } があったとします。 ここでたとえば  int s1,s2; に対して、 s1 = example(3); とすれば、 s1 = 3 となりますが、 s2 = example(-5); とすれば、 s2 には何が代入されているのでしょうか? 例に書いた関数はしょーもないものですが、 もう少し難しい関数を使って変数に値を入れて、その値で後でfor文などを使って仕分けていくようにしたいのですが、エラー時に代入されるものがわからなくて困っています。 エラー時のみに目印となる値、たとえば -1 などを戻り値とすることはできません。 おねがいします。

  • 文字列と整数型について

    はじめまして。 どうしても困っているのでヒントでも良いのでおねがいします。 関数内(func1)で確保した文字列変数のポインタを 別の関数(func2)にポインタ渡しします。 func2内で整数型で計算した結果を引数で示された文字列変数に 代入するというようなことをしたいと思ってます。 ここで、intは4byteとします。 メモリ長だけで見ると、bit[4] = tmp です。 void func1(){ char bit[4]; func2(bit); return; } void func2(char* p){ int tmp = 0x10101100; p = tmp; <---- ??? return; } そこでどのようにすれば、 代入することができるのか分かりません。 以下のような結果になるように代入したいと思っています。 bit[0] = 0x10; bit[1] = 0x10; bit[2] = 0x11; bit[3] = 0x00; 小さな文字列型に整数型をどのように渡せばよいのかが 一番疑問に思っているところです。 整数型に文字列型を代入する場合には 文字列のバイト指定とシフト演算で実現できています。 ヒントでもよいのでお願いします。

  • 引き数がポインタでない関数の戻り値はなぜint型なのか?

    最近、疑問に思っていることがあって質問したいんですが、一般的にc言語 で使われる関数っていうのは、引き数としてポインタをとる関数以外は全て 戻り値はint型なのですがこれはなぜでしょう。私自身の結論としては、も し関数の戻り値がchar型だとしたらchar型で表せる範囲の値は全てasciiコー ドとして使われているので、もしエラーがあって戻り値としてEOF(-1)を返す 際に1byteでは同じビット配列になる255が既に使われていてEOFとして-1を定 義できないために、-1と255が同じビット配列ではない1byte以上のデータ型 つまりint型(たぶん、int型がコンピュータが一番効率良く処理できるデータ型なのでたぶんint型を使ったと思いますが)を使ったのではないかと言う 結論に達したのですがこれは正しいのでしょうか。どなたか御教授お願い致 します。

  • 戻り値で返したオブジェクトの寿命について

    Ruby初心者です。 【前置き】 メソッドで宣言した変数(以下arr)に値(以下[1,2,3])を代入し戻り値として返した場合、 メソッドの戻り値(以下retArr)には、[1,2,3]への参照(arr.object_id)が設定されると認識しております。 ----------------------- def method arr = [1,2,3] return arr end retArr = method() ----------------------- 【質問】 C言語の場合、関数内で宣言したローカル変数のアドレスを戻り値として返却した場合、 関数を抜けた時点で、そのアドレスの内容は保障されなくなりますが、 1.Rubyではその様な問題がなく動作するのは、何故でしょうか? 2.また、メソッド内で宣言したオブジェクト(上記[1,2,3])の寿命はいつまでなのでしょうか? 【備考】 いろいろと調べてみたのですが、オブジェクトの参照(object_id)は、ポインタに近い概念であることは記載されているのですが、その仕組みを理解できずに悩んでします。

    • ベストアンサー
    • Ruby
  • 戻り値について

    ただ今、c言語の勉強をしている者です。 本を読んでいて分からないところがあったので ご指導して頂ければと書き込みました。 それは、最初と最後のところです。 int main(void) { ・ ・ 処理 ・ ・ return 0; >int main(void) このintというのは 戻り値が整数だと言うことだと思うのですが 戻り値が文字の場合ということも あるということですか? 例えば、 char main(void) ということもあるのでしょうか? また、voidというのは 他の名前にしたらいけないのでしょうか? > return 0; というのは、 正常に終わったら戻り値を0にしろということですか? ご指導して頂ければと思います

  • const int&の戻り値について

    const int&の戻り値について c++で「const int&(const int a)const{...」についてのメンバ関数がありますが、そのconst int&はどういう意図に使われるのでしょうか。 &があるので、アドレスを返すと思いますので、ポインタ変数に入れるだけでしょうか。それでもポインタ変数とメンバ関数の戻り値のアドレスは違うのはどういうことでしょうか。 主な使い用途がありましたら、教えてください。

  • 整数問題

    a,bを整数とする。 a^2009+b^2009となる正の整数が2009桁以下であるとき、 このような整数は何通りあるか。 正直どこをとっかかりにするとよいのか分からないが、 考えてみたのは、 (1)a,bがどちらも正の整数でa>=bのときを考える。 (2)(1)のとき、2009桁以下だから、1=<a=<9が必要となる。 (3)1=<a=<9のそれぞれのaの値に対して、bの値を考えるが、2009桁を超すのが  bがどの値のときか、またはすべての1=<b=<9で2009桁を超さないのか、判断できず。 上の場合分けだと、b=<0=<a のとき、を考えなければならないが、 このときは、aはいくらでも大きくできるのでないかと思い、この考え方はだめだと思った。 よろしくアドバイスお願いします。

  • int型のchar型への代入について

    VC++6.0のfgetcのヘルプに以下のようなコードが有りました。 int型のchをcharのbuffer[i]に代入するということに違和感を感じたのですが、 1.このようにする必要性とは何なのでしょうか? 2.このような代入により具体的には何が行われているのでしょうか? 3.そもそも1文字とりだすfgetcの戻り値がcharでなくintなのはなぜ? 質問が漠然としていて申し訳ありませんが、お願いします。  FILE *stream; char buffer[81]; int ch; 省略   stream = fopen( "fgetc.c", "r" )) 省略 ch = fgetc( stream ); 省略 buffer[i] = ch;

  • ポインタを使って構造体の配列を戻り値にするには

    関数の戻り値を構造体の配列(アドレスを受け渡しを利用して)にしたいのですがうまくゆきません。 以下のプログラムではコンパイルはできるのですが、 a0 = 2 a1 = 4198512 a2 = 4329332 と表示されてしまいa1,a2がうまくゆきません。 ********************************************* #include<stdio.h> struct test{ int a; }; struct test *func(void); void main(void) { struct test *data;//構造体ポインタ int i; data = func(); //ポインタにtest関数の戻り値(アドレス)を代入 for(i=0;i<=2;i++){   printf("a%d = %d\n",i,(data+i)->a); //構造体要素を表示 } } struct test *func(void) { struct test data[3]={1,2,3}; //構造体配列を定義 return (&data[0]); //構造体配列の先頭アドレスを返す } ************************************************* test関数から受ける取ったアドレス(&data[0])をポインタ(data)に代入して1づつずらして表示させれば a0=1,a1=2,a=3 となると思ったのですがどこが間違っているのでしょうか? よろしくお願いします。