ページ 11

無題

Posted: 2009年2月17日(火) 21:27
by 馬鹿太郎
このプログラムは文字列strの中に文字の個数を調べるものですが、

・ch[0]をstr_chnumに渡すとき、どうしてint型なのですか?ch[0]は文字なのですから、char型ではない
 のですか?int型は文字も取り扱えるのですか?

・constは静域期間を持つって、書いてありましたが、ここではどうしてconstが使われているのですか?

よろしければ、教えてください。


#include <stdio.h>

int str_chnum(const char str[/url], int c);

int main(void)
{
char str[256]:
char ch[10];

printf("文字列を入力してください:");
  scanf("%s", str);

printf("検索する文字を入力してください:");
  scanf("%s", ch);

printf("その文字は%d個含まれています。\n", str_chnum(str, ch[0]));

return 0;
}

int str_chnum(const char str[/url], int c)
{
int i;
int count = 0;

for ( i = 0; str != '\0'; i++) {
if (str == c) {
count++;
}
}
return (count);
}

Re:無題

Posted: 2009年2月17日(火) 21:55
by kazuoni
>h[0]をstr_chnumに渡すとき、どうしてint型なのですか?ch[0]は文字なのですから、char型ではない
 のですか?int型は文字も取り扱えるのですか?

先ほどもいいましたが、JISコード採用のためです。
str[3]="ABC"

str[3]={'A','B','C'}
ともあらわすことができます。
'A'はint型です。


>constは静域期間を持つって、書いてありましたが、ここではどうしてconstが使われているのですか?
strはアドレスを渡すことになります。
もしかしたら呼び出した関数でstrの内容が書き換えられてしまうかも知れません。
これを防ぐためにconstをつけています。

Re:無題

Posted: 2009年2月17日(火) 22:11
by box
>int型は文字も取り扱えるのですか?

char型を「文字型」と考えるよりは、「扱える範囲が狭い整数型」と
考える方がよいです。
その、狭い範囲の整数の中に、数字や英字や記号などのコード番号を
含んでいます。

int型はchar型よりも広い範囲の整数を扱えます。
つまり、int型はchar型を完全に包含していて、
int型で扱える範囲の中に数字や英字や記号などのコード番号を含む、
というわけです。

# JISコードだからどうこう、という話ではないと思う。

Re:無題

Posted: 2009年2月17日(火) 22:21
by kazuoni
失礼しました。。
昔TAさんがこんな感じで言っていたので、
誤認してました。。
あくまでJISコードのように「連続している」
っという意味だったのかも知れません。。

大変失礼しました。
訂正していただき、ありがとうございました!
(間違ったアドバイスにならなくてよかったです・・・。)

Re:無題

Posted: 2009年2月17日(火) 22:24
by たかぎ
> ・ch[0]をstr_chnumに渡すとき、どうしてint型なのですか?

それはプログラムを書いた本人に聞いてください。
この場合には、int型である必然性はありませんし、int型にしたことによる弊害も発生しています。
(実害はないと思いますが)

> ch[0]は文字なのですから、char型ではないのですか?

そうです。

> int型は文字も取り扱えるのですか?

文字も取り扱えます。

> ・constは静域期間を持つって、書いてありましたが、

どこにそんなことが書いてあったのか知りませんが、明らかなガセ情報です。

Re:無題

Posted: 2009年2月18日(水) 14:00
by 馬鹿太郎
どうして、int型は文字も取り扱えるのですか?
なんだか、頭が混乱してきたようです。

int型→整数
char型→文字

を処理するものと思っていました。
詳しく教えていただけないでしょうか

Re:無題

Posted: 2009年2月18日(水) 14:13
by たいちう
> 詳しく教えていただけないでしょうか

boxさんの回答が詳しいと思うけど。
どこがわかりません?

Re:無題

Posted: 2009年2月18日(水) 14:16
by kazuoni
参考になるか分かりませんが・・・
http://www.geocities.jp/ky_webid/c/010.html

Re:無題

Posted: 2009年2月18日(水) 14:16
by toyo
int型→整数
char型→文字
名前の由来はそうだと思われます
integerとcharacterからつけられたのでしょう
でも内容はどちらもただの整数です
charは1バイトの整数でintは多くの32ビットコンパイラでは4バイトの整数と扱える数値の範囲が違うだけです。
文字というのは人間が適当な数値を文字として扱うと決めただけなのでコンピュータにとっては文字も整数も区別してません。

Re:無題

Posted: 2009年2月18日(水) 15:28
by Kou
toyo様と同じ様な内容となりますが、

C言語に限らず、プログラム言語はすべて数字(数値)で処理します。
「A」という文字もコンパイラから見れば、「65」という数値でしかありません。

その数値を対応した関数なりのプログラムが、65→「A」という文字として画面に表示しているに過ぎないんです。

ですから、
chr型=文字
int型=数値
ではなく、どちらも同じ数値なんです。ただ扱える範囲が違うだけです。
その数値をどう処理するかは、プログラム次第って事になります。

※「A」の文字コード、もしかしたら64かもしれません・・・間違っていたらすみません。

Re:無題

Posted: 2009年2月18日(水) 15:38
by たかぎ
> 詳しく教えていただけないでしょうか

根本的なことから説明すると...

一般的な意味での「文字」というのは、言語的な意味を表す記号なり、符号なりのことです。
これは、必ずしも視覚や触覚で知覚できる(形状によって識字できる)ものばかりではありません。
コンピュータで扱う文字は単なる符号であり、表示装置に出力する場合には、その符号を何らかのフォントに置換するわけです。

これを踏まえた上で...

文字たる符号はコンピュータでは数値です。もっと具体的には整数値です。
そして、整数を格納できる型の表現範囲および精度が、文字たる符号を表現するのに十分であれば、どんな型でもよいのです。
極端な話、double型で文字たる符号を表現してもよいのです。ただし、そんな効率の悪いことをする人はいませんから、ライブラリのサポートを受けることは普通できません。必要なら、自分でライブラリを実装する必要があります。

ここで、char型というのは、表現範囲が少なくとも-127~+127または0~255のいずれかである整数型です。
それに対して、基本実行文字集合(乱暴にいえば、半角の英数字記号だと思ってよいでしょう)は、char型で表現できること、そして正の値を持つことが規格上保証されています。

また、int型の表現範囲は少なくとも-32767~+32767ですので、普通はchar型の全表現範囲を包含します。
「普通は」と書いたのは、もし、char型の表現範囲が0~65535でint型の表現範囲が-32768~+32767となるような処理系では、そうならないからです。

このことから、「普通は」、基本実行文字集合であれば、char型でもint型でも表現することができます。
ただし、漢字や(半角であっても)カナ文字などの拡張実行文字集合はこの限りではありません。

Re:無題

Posted: 2009年2月18日(水) 15:51
by non
>ここで、char型というのは、表現範囲が少なくとも-127~+127または0~255のいずれかである整数型です。
-128~+127ではないのですか?

Re:無題

Posted: 2009年2月18日(水) 16:02
by Kou
普通にintといえば
符号付(+、-)ですが、符号なしで宣言すれば、0~255までの範囲を使用できます。

Re:無題

Posted: 2009年2月18日(水) 16:08
by non
Kouさんへ
私に対するRESならば、私がいいたいのは、負数を2の補数で表現するのか、1の補数で表現するのかという
ことです。

Re:無題

Posted: 2009年2月18日(水) 16:14
by Kou
non様、すみませんでした。
Nameの所を見ていなかったので、質問者様がchr型の有効範囲について質問されたのだと勘違いしていました。

失礼の段お詫びいたします。

Re:無題

Posted: 2009年2月18日(水) 16:27
by GPGA
>-128~+127ではないのですか?
昔、Cマガジンの問題集の中に同じようなものがありました。

Cの規格レベルでは、char型は少なくとも-127~+127の値が保障されています。(つまり1の補数)
1の補数にするか2の補数にするかは、実装レベルのお話になります。

Re:無題

Posted: 2009年2月18日(水) 17:10
by たかぎ
> 1の補数にするか2の補数にするかは、実装レベルのお話になります。

正確には、

・1の補数
・2の補数
・符号および絶対値

のいずれかになります。

Re:無題

Posted: 2009年2月18日(水) 18:02
by non
> 1の補数にするか2の補数にするかは、実装レベルのお話になります。

実装レベルってのが、よくわからないのですが。
コンパイラによるのか?OSによるのか?CPUによるのか?
昔、汎用機で1の補数になってたマシンはみたことがあるのですが、DOSマシンで
1の補数や、絶対値で表しているコンパイラはあるのですか?

Re:無題

Posted: 2009年2月18日(水) 18:24
by たかぎ
> コンパイラによるのか?OSによるのか?CPUによるのか?

最終的にはコンパイラ(またはインタープリタ)によります。

> 昔、汎用機で1の補数になってたマシンはみたことがあるのですが、DOSマシンで
> 1の補数や、絶対値で表しているコンパイラはあるのですか?

DOSマシンを翻訳環境または実行環境とする処理系であっても、1の補数を用いるコンパイラやインタープリタを実装することは可能です。
また、馬鹿太郎さんは処理系を特定していませんので、特定の処理系を仮定するのは無意味です。

Re:無題

Posted: 2009年2月18日(水) 19:09
by non
みなさんがよく使っているコンパイラはどうなのかと思いましてお尋ね致しております。
メジャーなコンパイラで2の補数以外の処理を行っているコンパイラをご存じでしたら
教えてください。

Re:無題

Posted: 2009年2月18日(水) 20:22
by GPGA
今使用しているCodeWarriorではchar型は0~255の整数型として扱われています。
1の補数のコンパイラには、出会ったことがないですね。