- ベストアンサー
C言語strcmpについて
下記のプログラムでstrcmp動かしたところ、理論的には、68と表示されるところ、1と表示される理由を教えてください。詳細部分は、省略します、たとえば、include,const strcmp("ABCDE","ABC"); int strcmp(char *s1,char *s2){ while(*s1==*s2){ if(*s1=='\0') return (0); s1++; s2++; } return(( unsigned char)*s1 - (unsigned char)*s2);
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
ちゃんと自前のが呼ばれていますか? 標準ライブラリの strcmpが呼ばれてませんか? コンパイラは何を使ってますか? g++,clang++で#include <sting.h>して確認したところ、自前版ではなく、ライブラリの方が呼ばれていました。 ライブラリのものはstrcmp(const char*,const char*)なので、自前版strcmp(char*,char*)はオーバーロードされた別の関数として扱われます。 そして、"ABCDE"はconst char*ですから、const char*の方が呼ばれることになります。 確実に自前版を呼びたければ、名前を変えるとか、namespaceを指定するとか。 あと、g++では1、clang++では68になりました。 標準ライブラリのstrcmpの仕様で言えば、戻り値は「正,0,負」なので、どちらも正解です。 あと、あなたのstrcmpで返るのは 'D' - '\0' (== 'D' )です。68になるかどうかは、環境依存です。 ASCIIを使っているものが多いので、68になる確率は多いですが。
その他の回答 (7)
- qhtsige
- ベストアンサー率45% (9/20)
ユーザ定義のstrcmpは確かに呼んでいましたか。
- Tacosan
- ベストアンサー率23% (3656/15482)
#5 でも言われてるんだけど, プログラムを包み隠さず全部出してください.
- kmee
- ベストアンサー率55% (1857/3366)
WindowsでVCだったら、文字コードはASCII(互換), 'D'==68です。 繰り返しますが、1になるのは、おそらく、VC++のライブラリのstrcmpが呼ばれているから。 if (*s1 > *s2 ) return 1 ; のようなコードになっているのでしょう。これなら文字コードに関係なく、1が返ります。 デバッガで追い掛ければ、あなたの作ったコードを使ってないのがわかるでしょう。 定義をバッサリコメントアウトしても、そのままエラーにならずにコンパイルできるでしょう。 本当にC言語としてコンパイルしていたら、同じ名前の関数が使えないのでエラーになるはずです。 拡張子がcppになっている、などで、実際にはC++としてコンパイルされているのではないでしょうか。 VisualStudioの雛形を使ったりした場合、自分で意識してなくても、どこかで#include <string.h>(または#include <cstring>)が入ってしまっていることがあります。
- asuncion
- ベストアンサー率33% (2127/6290)
>68と表示されるところ、1と表示される理由を教えてください。詳細部分は、省略します 当方でも1と表示するために、 main関数などを含む、コンパイルするために必要な情報「も」提示してください。 その関数「だけ」見せられましても、 質問者さんと同じ環境を作るためには勝手にmain関数を作るわけにいかず、 いかんともしがたいです。
お礼
回答ありがとうございます。環境は、windows xp,Visual studio 2008 Express Edition
- TooManyBugs
- ベストアンサー率27% (1472/5321)
処理系、OSを明記する必要が有ります。 表示されると書いていますが表示している所がありませんね。 質問以前の問題が多すぎ。
お礼
回答ありがとうございます。環境は、windows xp,Visual studio 2008 Express Edition
- qhtsige
- ベストアンサー率45% (9/20)
補足です. 関数定義のint strcmp(char*,char*)を書くと意図通りになるかな? 組み込みでない、ユーザ定義関数を使うという意味です。
- qhtsige
- ベストアンサー率45% (9/20)
処理系も、mainのコードもわからないので試していないですが、もしかすると、int strcmpは実行されずに、組み込み関数のstrcmpが実行されているのでは?そうならば、1で戻るのが正しいです。 この場合は関数内でprintf文など入れて確かめるとわかりますね。もし関数を確かに実行しているならば68となりそうなのでわかりません。
お礼
回答ありがとうございます。環境は、windows xp,Visual studio 2008 Express Edition
お礼
回答ありがとうございます。環境は、windows xp,Visual studio 2008 Express Edition
補足
1の場合、環境OS---windows XP,Vsual studio 2008 Express Edition , 文字コード体系とコード値を教えてください。