C言語関係掲示板

過去ログ

No.36. atoiは全角では使えない


とっても初心者です。基本的なことで頭を悩ませています。
下のプログラムを打ってコンパイルさせました。エラーはでませんでしが、
いざ実行すると…atoiが上手くいかず、文字列を整数に直してくれません。
3択を最初から整数で入力すると…たとえば3と…ちゃんと33333と表示して
くれます。が、文字入力で3と入力するとatoiは全く働かず(怒)"dame"と
defaultに分岐してしまいます。どうしてatoiが上手くいかないのでしょう?
教えてください、泣きそうです。
#include<stdio.h>
#include<stdlib.h>

int main(void);
int main(void)
{
int n;
char buf[10];

printf("1,2,3の中でどれかを入力\n");
gets(buf);
n=atoi;
switch(n){
case 1:
printf("11111\n");
break;
case 2:
printf("22222\n");
break;
case 3:
printf("33333\n");
break;
default:
printf("dame\n");
break;
}
return(0);
}


>下のプログラムを打ってコンパイルさせました。エラーはでませんでしが、
>いざ実行すると…atoiが上手くいかず、文字列を整数に直してくれません。
>どうしてatoiが上手くいかないのでしょう?
>教えてください、泣きそうです。
>#include<stdio.h>
>#include<stdlib.h>
>
>int main(void);
>int main(void)
>{
> int n;
> char buf[10];
>
> printf("1,2,3の中でどれかを入力\n");
> gets(buf);
> n=atoi;
> switch(n){
> case 1:
> printf("11111\n");
> break;
> case 2:
> printf("22222\n");
> break;
> case 3:
> printf("33333\n");
> break;
> default:
> printf("dame\n");
> break;
> }
> return(0);
>}

n = atoi; を n = atoi(buf); にしましょう。
たぶんatoi()関数に集中し過ぎて見逃してしまったのではありませんか?
私もよく「灯台下暗し」のようなことやってしまいます。
どの文字列を整数に変換するのかをatoi()関数に教えてあげないと
関数の方も変換のしようがないのでしょう。

もしかして、お使いのコンパイラはlsic86試食版ではありませんか?
私の持っている他のコンパイラでは、
コンパイルはできるもののエラーはきちんとでてきます。


それはそうと、int main(void);(上の方)
はint main(void)(下の方)のプロトタイプ宣言のように
なっているように見えるのですがどのような意味があるのでしょうか?


おはようございます、ともじです。

>とっても初心者さん
> 下のプログラムを打ってコンパイルさせました。エラーはでませんでしが、
> いざ実行すると…atoiが上手くいかず、文字列を整数に直してくれません。
> 3択を最初から整数で入力すると…たとえば3と…ちゃんと33333と表示して
> くれます。が、文字入力で3と入力するとatoiは全く働かず(怒)"dame"と
> defaultに分岐してしまいます。どうしてatoiが上手くいかないのでしょう?

確かに、toshi_2さんの指摘のように、n=atoi(buf)ですね。
ただ、コンパイルエラーが出ないというのと、文字入力で3ということですので、
n=atoi(buf) となっていると仮定して答えます。

半角の「3」と、全角の「3」は違うんですね。
半角で入力した「3」は1バイトのデータでASCIIコードの0x33ですが、全角で入力
した「3」は2バイトのコードになってしまいます。ですから、atoi関数は全角の「3」
はきちんと整数データの「3」には変換してくれないのです。
つまり、プログラムのミスではなく、入力がよくないということですね。

>toshi_2さん
> それはそうと、int main(void);(上の方)
> はint main(void)(下の方)のプロトタイプ宣言のように
> なっているように見えるのですがどのような意味があるのでしょうか?

おっしゃる通り、main関数のプロトタイプ宣言です。
main関数も関数ですから、ちゃんとプロトタイプ宣言をするのが本当なんでしょうね。
まあ、大抵は省略してしまいますが。


toshi2さん、ともじさん
ありがとうございます。"dame","dame"とばかり表示されるので
悲しい気持ちになっていました。が…今日は晴れ晴れと休日を過ごせ
そうです。
atoiでは全角文字は整数には出来ないのですね..全く
知りませんでした。こういう細かいところが難しいですね^^;。
もし全角文字を整数に直したい時はどうすればいいのでしょうか?


>もし全角文字を整数に直したい時はどうすればいいのでしょうか?

変換用の関数を作るしかないでしょうね。
よかったら挑戦してみてください。


>変換用の関数を作るしかないでしょうね。
>よかったら挑戦してみてください。
今の自分には難しいです、もっと勉強をしないと…^^;
地道に努力を続けます…
なにはともあれatoiの使い方が分かっただけでも
感謝感謝です。ありがとうございました。

戻る


「初心者のためのポイント学習C言語」 Last modified:2001.8.8
Copyright(c) 2000-2002 TOMOJI All Rights Reserved