- ベストアンサー
整数を文字列として認識したい
整数を文字列として認識したいんですが、可能なのでしょうか? 例えば、i=12470というint型の整数があるとして、1万の位の数1や、十の位の数7だけを取り出したいんです。 しかし、この際、1万の位の数1をi/10000、十の位の数7を(i%100)/10などというようにしては取り出したくないんです。 ややこしい質問ですが、よろしくお願いします。 というのも、整数を文字列として認識する目的は、int型として送られてきたデータが本当に整数なのかをチェックするためだからです。 初心者なので合っているか分かりませんが、整数を文字列として認識できれば、isdigit関数を使うことで、データが本当に整数なのかをチェックすることができるのかなあと考えているんですが・・・ もし、私の考えが間違っていたり、他に良い方法があったら是非教えて欲しいと思います。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
#3です。 >これで送信側のtime_aに文字が含まれていないことは確認できたんですが、受信側ではどうチェックすればいいのか分からないのです。 全く意味の無い心配です。 int time_a, time_b; time_a = atoi(buf); で整数化した後、すぐ後で続けて、 time_b = time_a; と別のint変数に代入したとして、「time_bに文字が含まれているか」不安ですか?上記の心配はそれと同じレベルのことです。 socket通信では、データが変化することはありませんので型や長さを間違わなければ同じ値が渡ります……intで送信してfloatで受信するなどすると駄目ですが。(異なるCPU種類のコンピュータ間では、型や長さに加えて“バイトオーダー”という数値のならぶ順序も考慮する必要があります) それ以前の問題として、文字としての数字と、2進数の整数との混同があるようなので、まずそのあたりをきちんと押さえるべきでしょう。 #4,#5,#6の方々が書いている「通信によるデータの変化」はシリアルポートやパラレルポート等を使ったプロトコルなしの通信を考えてのことだと思います。通信手段をsocketと特定しなければ、ノイズなどでデータが変化することはあります。
その他の回答 (6)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>scanf("%d",&i);でiをキーボードから入力するときなど、間違えて文字を入力してしまった場合などはどうなるのでしょうか? scanfで指定した書式に(この場合%d)に反するような文字が見つかった時点で変換が打ち切られます。 例えば 123aと入力した場合、123が入力されたことになります。 >送信から受信の過程でエラーが生じて、データが変わってしまって もし、データが変化してしまったとしても、現在int型でデータを受けているのであれば、そのそれぞれの桁を調べても、意味がありません。(数値として調べることになるので、数値かどうかを検査する意味で調べることはできません) データが変化したかどうかは、通常だったら そのデータのサイズに見合ったCRCコードを付与してデータを送信し、 受信側ではCRCコードを再度計算し、一致しない場合(自動修正できない場合)は再送要求をします。 このようにしないと、受信側のデータを調べた所で、何がどのように違ってしまっているのか判断できないと思います。
お礼
回答ありがとうございました。
- tatsu99
- ベストアンサー率52% (391/751)
>int型の整数を送ったが、送信から受信の過程でエラーが生じて、データが変わってしまって(こんなことはありえないのかな?) 十分ありえます。 >受信側には文字が含まれてしまっていた。それをチェックしたいんですが・・・。 数値が結果として文字として表示されることはあります。 int a = 65;とするとaには65が格納されますが、 16進コードでは0x00000041となります。ここで4バイト目の0x41は文字のAを示します。 従って、貴方の質問は、以下のように質問するのが、正しい方法です。 -------------------- 送り側で送ったデータを受信側で表示してみたが、その内容がおくったはずのものに一致していない。これは何が原因でしょうか。 ---------------------------- 上記のケースは、 1.本当に内容が変わった為、受信側で表示した内容が違っている場合のケース 2.内容が変わっているわけではないが、受信側の表示方法が誤っているため、内容が変わっているように見えるケース が考えられます。 したがって、どのようにして、送ったか。受けたデータをどのようにして表示したか、が判らないと回答できません。その部分のソースを公開していただければ、良い回答が得られる可能性が高くなります。
お礼
回答ありがとうございました。
補足
int型の整数time_aを send(Sock,(char*)&time_a,sizeof(int),0); というふうに送信し、 int time_a; recv(NewSock,(char*)&time_a,sizeof(int),0); というふうに受信しました。 ここで送信する側のtime_aは、 char buf[10]; gets(buf); としてキーボードから入力した値に文字が含まれていないかを int i=0; while (buf[i] != '\0') { if ((isdigit(buf[i])==0)){ exit(1); } i++; } というふうにチェックした後、 int time_a; time_a = atoi(buf); として、文字列を数値に置換しました。 これで送信側のtime_aに文字が含まれていないことは確認できたんですが、受信側ではどうチェックすればいいのか分からないのです。 あと、受けたデータを表示することはしないです。 このような補足で分かってもらえるでしょうか?
- ret
- ベストアンサー率40% (8/20)
int型に入るのは全て整数です。 int a; scanf("%d", &a); として、文字が入力されても int aには何も入りませんが、 それはscanf関数が仕様として行っていることで int型に文字は入れられないということではありません。 実際に int a = 'a'; などを行っても エラーではなくちゃんと格納されます。 送受信時にエラーが起こり受信したint型の中身が 変わるだけで整数は整数なのです。 つまり、35が送られてきたときに 何らかのエラーがあったとしても 84とか別の数字に変わるだけで整数は整数です。 ですから整数かどうかでエラーチェックしても int型をチェックすれば全て整数として エラー判定はできません。 それならパリティーチェックかチェックサムで エラー判定を行ったほうがよろしいのでは?
お礼
回答ありがとうございました。
- notnot
- ベストアンサー率47% (4900/10358)
数字文字と整数値の混同があるようですね。 >int型の整数を送ったが、送信から受信の過程でエラーが生じて、データが変わってしまって(こんなことはありえないのかな?) ありえません。int型には整数しか入りません。文字を入れても整数です。例えば、 int x = 'A'; なら、xには65という整数が入ります。 scanfの場合は、 >scanf("%d",&i); >でiをキーボードから入力するときなど、間違えて文字を入力してしまった場合などはどうなるのでしょうか? やってみればすぐにわかりますけど。 scanfを使うなら返り値のチェックは必須です。scanfは変数に正しくセットされた変数の個数の整数値を返す関数です。 上記に対して例えば A を入力したら、整数値として不正なので、scanfの返り値が0で、iの値は不変(scanf実行前のまま)です。
お礼
回答ありがとうございました。
- tatsu99
- ベストアンサー率52% (391/751)
>というのも、整数を文字列として認識する目的は、int型として送られてきたデータが本当に整数なのかをチェックするためだからです。 この質問の意味が不明です。 「int型として送られてきたデータが本当に整数なのか」 ですが、int型のデータは、必ず整数です。 int a;として宣言したaには、必ず整数が入ります。 あなたの質問は「aの内容が本当に整数なのか」の質問と同じことになります。 「int型として送られてきたデータが本当に整数なのか」 の意味をもう少し補足していただけませんでしょうか。
補足
う~ん、「int型として送ったデータ」と言ったらいんでしょうか・・・int型の整数を送ったが、送信から受信の過程でエラーが生じて、データが変わってしまって(こんなことはありえないのかな?)、受信側には文字が含まれてしまっていた。それをチェックしたいんですが・・・。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
itoaか sprintfを使うことで文字列にできますよ。 というか、int型のデータの時点で整数だと思うのですが。
補足
あのちょっと話が変わるかもしれませんが、int型で宣言しても、例えば、 scanf("%d",&i); でiをキーボードから入力するときなど、間違えて文字を入力してしまった場合などはどうなるのでしょうか? これはint型データだけど整数じゃない? う~ん。すいません。初心者なんで、どう書けばいいのか・・・言いたい事はなんとなく分かってもらえるでしょうか・・・
お礼
そうですか、全く心配なかったんですね。 皆さんのおかげで、色々分かりました。 (特に自分の無知さが・・・) 回答ありがとうございました。