ページ 11

文字配列をint型に

Posted: 2007年4月03日(火) 01:17
by 熱海
再び質問です・・・

char ss[10]を用意して
fgetsで入力したss[0]~ss[10]に掛け算をして
その和を求めたいのですが、char型なので計算できません。。。
atoi()を使ってみたもののエラーが頻発してしまい、なかなかint型にできません。。。

どのように対処したらよいのでしょうか?

Re:文字配列をint型に

Posted: 2007年4月03日(火) 01:38
by 熱海
すみません、質問内容の訂正です。
ss[0]~ss[10]ではなく
ss[0]~ss[8]までの合計でした。。。

Re:文字配列をint型に

Posted: 2007年4月03日(火) 04:24
by むつ
まず、文字コード表をいつでも参照できる様にしておいてください。

そして、入力の段階で数値以外をはじき、計算に必要な条件がそろってから
目的の処理をしてください。

そうしないと、fgets()では 123a456b]\n こんなのも拾ってしまいますよ。

Re:文字配列をint型に

Posted: 2007年4月03日(火) 08:10
by 管理人
まず、

・何を掛け算したいのか
・何のエラーが出て困っているのか

がパッと見て把握出来ませんので、質問の際はその辺の説明を詳しく書いていただけると回答する側として助かります。

まず、文字コードについて理解してらっしゃいますか?

char ch;
scanf("%c",&ch);

で入っているcにはどのような役割があるかご存知ですか?

このお話は過去の回答で何度も説明しているので、こちらを参考にしてください。

http://dixq.net/kaitou13.html

ASCII文字コードはこの辺で確認できます。

つまり文字コード自体の掛け算をさせたいならatoiなどせずに単純にかけてやれば合計が出るでしょう。

かけ算をしてそのを求めたい

とおっしゃっているので、かけ算がしたいのか足し算がしたいのかよくわかりませんが、
積を求める時はint型の扱える範囲に注意してください。

int型で使用できる範囲は2の32乗/2-1までです。先ほどの解説にビットとバイトの話がありましたね。
int型は一般的に4バイトですから32ビットになります。int型はunsignedじゃない限り負も扱えるので、その半分の値が使用できる事になり、さらに0を使用するのでその-1となります。
実際にご自分で値を表示させたい時は

printf("%f",pow(2.0,32.0)/2 -1);

で確認できます。具体的に言えば

2147483647

までです。この値を超えないように積をしてやりましょう。
もしも「文字型で受け取った数字」のみを足し算したいのなら、文字が入っていたらエラーになるような処理をさせないといけません。

今回文字コードについて勉強したいのでatoiを使わずに自分でコードを書いてみましょう。

まず

問題1
・文字「0」の文字コード表示させてください

問題2
・受け取った1バイト文字が0~9の間ならTRUE,それ以外ならFALSEと表示させてください

問題3
・受け取った10バイトにそれぞれ入っている文字に対して問題2と同じ出力をさせてください。

問題4
・受け取った10バイトにそれぞれ入っている文字が数字かどうかを判断し、数字の時のみその積を計算していくプログラムを書いてください。

このような順番で順々にやっていけばコードは完成するでしょう。
やってみてください。

Re:文字配列をint型に

Posted: 2007年4月03日(火) 09:37
by box
> その和を求めたいのですが、char型なので計算できません。。。

char型は、狭い範囲の整数(-128~+127あるいは0~255)を扱う型です。
char型だから計算できない、ということはありません。
もちろん、他の型の場合と同様、オーバーフローなどには気をつけねばなりません。

Re:文字配列をint型に

Posted: 2007年4月03日(火) 09:46
by 管理人
boxさんのおっしゃる事をプログラムでみてみると、こういうことになります。
#include <stdio.h>
#include <math.h>


int main(){
	char a,b,c;
	a=12;
	b=6;
	c=a*b;
	printf("%d\n",c);
	printf("%c\n",c);
	return 0;
}
 
 
int型は4バイトのデータを入れる箱の種類です。
char型は1バイトのデータを入れる箱の種類です。

箱の大きさが違うだけで、同じものが扱えます。

このように、きちんと12*6が計算できますね。
%dで表示してやるとその格納されている数字が表示されます。
%cで表示してやると、その数字に対応した文字が表示されます。

char型は1バイトしか格納できませんから2の8乗つまり256種類までしか扱えません。
ですので、その扱える範囲に注意する必要があります。

Re:文字配列をint型に

Posted: 2007年4月03日(火) 11:39
by 熱海
ご回答ありがとうございます。

質問内容で混乱させてしまいすみませんでした。
私なりに、色々試させていただきます。

丁寧な対応、本当に感謝いたします。