学部生に「突然プログラムが変な動きをするから見て欲しい」と言われたので見てみました。 すると、シェル画面がプログラムを実行すると突然意味不明な中国語の羅列のような画面にかわったり、 特定のprintf文の最初の文字が表示されなくなったり意味不明な挙動をしていました。 print文の最初の文字が表示されないと言うのは printf("Count\n"); printf("Count\n"); ↓ Count ount こんな感じになるんです。しかし2番目を改行すると printf("Count\n"); printf("Count\n"); ↓ Count Count 正常に表示されたり、意味がわかりませんでした・・。 何が原因でなっているのか、一つ一つ見ていったところ、 文字コードに-50が入ったものを使用している部分がありました。 以下のような感じです。 char b[4]="abc"; b[2]=-50; printf("%s",b); これを実行すると何故か次からprintf文の最初の文字が表示されなくなったり、 シェル画面が中国語になったりしていました。 原因はよくわからないのですが、ウィンドウズではなりません・・。 linuxはよくわからない挙動をするので、質問に答えるのが結構大変です^^;
意味不明な挙動(雑談スレ)
意味不明な挙動(雑談スレ)
Re:意味不明な挙動(雑談スレ)
>原因はよくわからないのですが
うーん、実際やってみないとわかんないですけど、何となく端末が受け取った後の処理で
何かがずれてしまって以後間違ったまま解釈していったのではないでしょうか。
例えば EUC-JPだったとして、0xCE(-50)が第一バイトに 次の 0x00が第二バイトであると
(そんな文字コードはないのに)解釈されてしまったとか。
そういうあからさまにおかしい文字列を突っ込んだ場合はともかくとして、
Windows/Linux問わず、文字コードを決めつけて作られているプログラムを
実行したりすると普通に化けますよね。
ちなみに
実行すると見事に化けます(w
うーん、実際やってみないとわかんないですけど、何となく端末が受け取った後の処理で
何かがずれてしまって以後間違ったまま解釈していったのではないでしょうか。
例えば EUC-JPだったとして、0xCE(-50)が第一バイトに 次の 0x00が第二バイトであると
(そんな文字コードはないのに)解釈されてしまったとか。
そういうあからさまにおかしい文字列を突っ込んだ場合はともかくとして、
Windows/Linux問わず、文字コードを決めつけて作られているプログラムを
実行したりすると普通に化けますよね。
ちなみに
[color=#d0d0ff" face="monospace] char b[/url]="テスト";
printf("%s",b);[/color]
なシンプルなものでも Widows+MSVC7.1で、UTF-8/UTF-16(bom付き)で保存したソースをビルドして実行すると見事に化けます(w
Re:意味不明な挙動(雑談スレ)
なるほど。
しかし突然中国語?のような漢字だらけのシェル画面に豹変したときはびっくりしました^^;
resetとコマンドすると直ることが判明したんですが、入力中もresetに相当する意味不明な漢字が表示されるので怖いですw
学生がコードのprintfの書いている行を1段ずらすとコンパイルがうまくいくと言っているのを聞いて、
いや~それは関係ないだろうと思ってしまいましたが、
色々な可能性を考えるべきですね^^;
しかし突然中国語?のような漢字だらけのシェル画面に豹変したときはびっくりしました^^;
resetとコマンドすると直ることが判明したんですが、入力中もresetに相当する意味不明な漢字が表示されるので怖いですw
学生がコードのprintfの書いている行を1段ずらすとコンパイルがうまくいくと言っているのを聞いて、
いや~それは関係ないだろうと思ってしまいましたが、
色々な可能性を考えるべきですね^^;
Re:意味不明な挙動(雑談スレ)
お久しぶりです。
unix やら linuxの話っぽいのでちょっと質問・・・・
-lmってどういう意味のオプションでしたっけ?
最近Javaばっかりなので忘れてしましました><。
unix やら linuxの話っぽいのでちょっと質問・・・・
-lmってどういう意味のオプションでしたっけ?
最近Javaばっかりなので忘れてしましました><。
Re:意味不明な挙動(雑談スレ)
>printfの書いている行を1段ずらすとコンパイルがうまくいくと言っているのを
不思議ですねぇ。
たしかに実際問題 C/C++で書いたコードが正しくコンパイルされないことも多々はあります。
そういうときは、コンパイラにアセンブリコードを出力させて調べると・・・
今回の場合ですとprintfの行を変えて、吐き出されたコードを比較すると
どうなっているのかわかると思います。
gccなら -Sオプションだったかと思います。
>-lmってどういう意味のオプションでしたっけ?
-lはライブラリのリンクの指定で、-lmなら libm.aをリンクします。
不思議ですねぇ。
たしかに実際問題 C/C++で書いたコードが正しくコンパイルされないことも多々はあります。
そういうときは、コンパイラにアセンブリコードを出力させて調べると・・・
今回の場合ですとprintfの行を変えて、吐き出されたコードを比較すると
どうなっているのかわかると思います。
gccなら -Sオプションだったかと思います。
>-lmってどういう意味のオプションでしたっけ?
-lはライブラリのリンクの指定で、-lmなら libm.aをリンクします。
Re:意味不明な挙動(雑談スレ)
管理人さま・Justyさま>
返信ありがとうございます
libm.aが分からなくてググッてみたらなんとコマンド一覧(?)のページにたどり着けました!!
ここで修行してきます!
返信ありがとうございます
libm.aが分からなくてググッてみたらなんとコマンド一覧(?)のページにたどり着けました!!
ここで修行してきます!