みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

int とcharの使い方と違い

教えてgooに投稿するのは初めてですがよろしくお願いします。
最近C言語を勉強し始めた初心者です。
ネットのサイトを見て独学でしています。
過去スレッドをさらっと見て聞きたいことが書いてなかったので投稿します。(同じスレッドがあったらすみませんOTL)

#include<stdio.h>
int main(void)
{
int str='a';
printf("str=%c\n",str);
return0;
}
この上のプログラムでは str=a と出て、エラーが出ずにコンパイル出来ました。でも、

#include<stdio.h>
int main(void)
{
int str[]="abc";
printf("str=%s\n",str);
return0;
}
とするとエラーが出ます。

int とcharの使い方と違いについて詳しく教えてほしいです><
お願いします。

投稿日時 - 2008-11-17 16:47:48

QNo.4486018

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

int型からchar型に変えるべきだと思います。
char str='a';
後、printf("str=%c\n",str);の%cはchar型に対応してます。
int型は基本的に、%dです。

int str[]="abc";の部分ですがここも書き換えで、
char str[]="abc"に治すべきだなとおもいました。

printf("str=%s\n",str);の部分は、%cにすべきだと思います。

投稿日時 - 2009-05-16 08:53:18

ANo.6

余談ですが ISO 9899:1999 的には
・signed char の範囲は -127~127 より狭くない
・unsigned char の範囲は 0~255 より狭くない
・単に char とだけ書いたときに sign か unsigned かは処理系に依存
です. ということで「char が 7bit の環境」は存在しないはず>#5. 最低 8bit になります.
上限はないので, 9bit でもいいし 32bit でもいい.

投稿日時 - 2008-11-19 15:32:10

ANo.5

一応、補足をしておきますと

char の表現範囲は 8bitの場合、0~255の場合と、-128~127の場合と -127~+127の場合とあります。
ひょっとしたらそれ以外にもあるかもしれません。
-127~+127なんてのはかなり特殊な例ですが、どの範囲になるかは環境次第です。

char型に対して符号の有無を確実にしたい場合は signed/unsignedを付けて下さい。

又、charは 8ビットとは限りません。7bitや 9bitである可能性もあります。

最後に "ABC"は文字列リテラルとなりますので、char *strで受けるのは間違いではありませんが、
好ましくないので char str[] か const char *strで受けて下さい。

投稿日時 - 2008-11-18 16:42:46

ANo.4

'a'というのは数値です。多くの処理系では、aのasciiコードである97となります。
数値ですから、当然intの初期化にも使えます。
つまり、
int str='a';
と書くのは、
int str=97;
と書くのと一緒です。
一方、配列の初期化は、次のように、初期化子を用いなくてはなりません。
int str[4]={0,1,2,3};
なので、
int str[4]={'a','b,'c','\0'};
と書くことになります。
したがって、本来はchar配列の初期化も、
char str[4]={'a','b,'c','\0'};
と書かなくてはならないのです。
ただ、これでは不便なので、char配列の初期化に限り、
char str[]="abc";
と書くことができるようになっています。この特例はcharに限ったものですので、
int str[]="abc";
はエラーになります。
エラーとせずに、
int str[4]={'a','b,'c','\0'};
と、解釈してくれても良さそうなものですが、昔の偉い人が「エラーにする」と決めたので、いまでもエラーになります。

なので、違いとしては、charの配列は文字列として使うので、少々特殊な初期化ができるようになっているということですね。

なお、処理系によっては'a'が97でなかったり、ワイド文字があったりするなどありますが、それについては詳しく触れないことにします。

投稿日時 - 2008-11-17 18:04:00

お礼

ありがとうございます!自分が聞きたい事が理解できました。

投稿日時 - 2008-11-17 18:38:18

ANo.3

int=数値、char=文字列 だと思っていませんか?
intもcharも整数型のデータを意味します。両者の違いは
メモリ領域の大きさ=表現可能な範囲の違いだけです。
charは8ビットで、intはシステム依存ですが、多くは32ビットです。
C言語で"ABC"と書いた場合、文字列へのポインタを表します。
つまり、メモリ上の何処かに"ABC"という領域があり、そのメモリ上の
アドレスを示します。
よって、int str[] = "ABC"; は間違いで、char *str = "ABC"; です。
また、char配列で定義するなら char str[] = {"ABC"}; のように
{}で囲みます。ここだけ特例で"ABC"が各1文字ずつのコードとして
配列の各要素に振り分けられます。非常に古いCコンパイラでは
char str[] = {'A','B','C',0}; のように記述する必要がありました。

このように、'A'とはAという字の文字コード(数値)を表すので、
int型変数で受けることが出来ますが、"A"は先に述べたように
文字列のアドレスを示すので、int型変数で受けることは出来ず、
文字列ポインタ型の変数で受ける必要があります。

投稿日時 - 2008-11-17 17:35:14

お礼

ありがとうございます。

投稿日時 - 2008-11-17 18:39:00

ANo.2

char 型は、1バイトで、文字1文字を表現するのに使用するデータ型です。
int 型は、整数を表現するのに使用するデータ型で、そのサイズは、プロセッサが処理するのに都合の良いサイズとされています。
例えば、32bitCPUの環境用のコンパイラだと、intは主に32bitとして処理されます。

仮にintを32bitとして話を進めると、
char の表現範囲:-128~+127
int の表現範囲:-2147483648~+2147483647
となります。

>int str='a';
表現範囲の狭い型charから、表現範囲の広い型intへのキャストは暗黙的に行われます。
'a'はchar型の情報です。

>int str[]="abc";
も表現範囲の狭い型char配列から、表現範囲の広い型int配列にキャストされそうですが、
これは出来ません。
何故出来ないかは、バイナリ状態のデータをダンプするとわかると思いますが、
"abc"はchar型の配列です。
内部表現は
{0x61, 0x62, 0x63, 0x00}と言う感じです。
0x61は'a'を表している、0x62は'b'を表している、0x63は'cを表している。
0x00は文字列の終端である事を表しています。
c言語では、文字列の終端は0x00で表す事になっている。

そして、int型の配列の場合、その内部表現は、
例えば、int array[] = {1, 2, 3, 4};
の場合、
{0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00}
と言うような感じです。

内部的なデータの持ち方が違うので、char配列から、int配列の単純な変換は出来ないと言う事です。

投稿日時 - 2008-11-17 17:22:31

お礼

詳しい説明ありがとうございます。とてもうれしいです。こんなに詳しく教えてくれるとは。感動です。

投稿日時 - 2008-11-17 18:05:33

ANo.1

int型もchar型も整数型の一種ですが、文字列を表すためには文字型(char, signed char, unsigned char)を使う必要があります。

投稿日時 - 2008-11-17 17:20:28