- 締切済み
C言語 文字列 比較に関する質問
C言語の文字列で数字を比較する場合以下の3パターンがあります 1.X > 5 2.X > ”5” 3.X > ’5’ あるchar属性の Yがあるとします char Y; Strncpy(Y,”5”); YY=atoi(Y); 上記1は X > Y 上記2は X > YY となりますが 上記3のシングルコーテーションとして 比較する関数を教えてください
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- venzou
- ベストアンサー率71% (311/435)
>上記3のシングルコーテーションとして比較する関数を教えてください 聞きたいことはなんとなくわかりますが・・・間違いが多い(^^; 5 は 整数(int) の 5 "5" は 文字列(char *) の 5 '5' は 文字(char)の 5 ''は1つの文字です。 ""は文字列(ヌル文字で終わる文字の配列の先頭のポインタ)です。 char *Y = "5"; int YY; YY = atoi(Y); 1 X > YY 2 strcmp(X, Y) 3 X > Y[0] 1 は 整数の比較 2 は 文字列の比較 3 は 文字の比較 文字列 Y の1文字目 Y[0] が '5' と同じことになります。 char *Y = "5"; char Y[2] = { '5', '\0' }; 上記の二つは同じ内容になります。分かるかな?
- a-saitoh
- ベストアンサー率30% (524/1722)
文字と文字列の違いをまず理解しましょう。教科書をよく読んでください。 ””でくくられた文字列定数(リテラル)は、基本的には <や>などによる比較は意味を持ちません。 現在の多くのコンピュータではASCIIを使っていますので 5<'5'ですが、メインフレームなどだと 5>'5' となるマシンもありえます(たとえばEBCDICを使っていて文字リテラルがsignedの場合)。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★C言語の初心者さんですね。 ・C言語での文字列の比較は『strcmp』という関数になります。 『<』、『<=』、『>』、『>=』、『==』、『!=』などの比較演算子では比較できません。 ・ですから質問者さんの 『上記1』は整数などの数値の比較、 『上記2』は文字列ポインタの比較?、 『上記3』は文字定数の比較になりますよ。 ・また C言語での文字列は、文字型の配列を利用して表現します。 VisualBasic、JavaScript、Perlなどの文字列型とは構造が違います。 よって『Strncpy』関数のところは次のようになります。 char Y[ 10 ];←余裕を見て 10 バイトを指定です。 int YY; strcpy( Y, "5" ); ←『Y』に『"5"』という文字列をコピー YY = atoi( Y ); ←『Y』という文字列を整数値に変換して『YY』へ代入 ●本題 ・文字列の比較は『strcmp』で行います。 char aaa[] = "abc"; char bbb[] = "abcdef"; int cmp; if ( (cmp = strcmp(aaa,bbb)) == 0 ){ printf( "『aaa=bbb』両方の文字列は同じです。\n" ); } else if ( cmp < 0 ){ printf( "『aaa<bbb』aaa の文字列が小さいです。\n" ); } else if ( cmp > 0 ){ printf( "『aaa>bbb』aaa の文字列が大きいです。\n" ); } 最後に: ・『strcmp』関数の戻り値は『0以下』、『0』、『0以上』の3つの状態を返しますが、 これが文字列の比較結果になります。 『0以下』は第1引数が第2引数よりも小さい(短いなど)です。 『0』 は第1引数と第2引数の文字列が全く同じです。 『0以上』は第1引数が第2引数よりも大きい(長いなど)です。 ・文字列の最後は『\0』というNULL文字が終端になっています。 VisualBasic などでは自動的にメモリ容量が拡張したりしますが、C言語では拡張はしません。 もう少し C言語の特徴(文字列とは?)をお勉強して下さいね。 ・以上。おわり。
- koko_u
- ベストアンサー率12% (14/116)
何がしたいのかサッパリですが。 atoi のシグニチャは atoi( const char* ) なので間違ってるし、そもそも atoi は最早使われない関数。 ついでに strncpy のシグニチャは strncpy( char*, const char*, size_t ) マニュアルくらい読みましょう。
> 上記1は X > Y > 上記2は X > YY となりますが xの値がわかりませんので、これらの不等式が 成り立つかどうかはわかりません。 ところで、strncpyは引数が3つ必要です。 仮に、strcpyのつもりであったとしても、 1バイトの領域yに2バイト('5'と'\0')を 無理矢理コピーすると、どこかでとんでもないエラーが 発生するかもしれません。
お礼
お忙しい所、初心者の人間に丁寧な回答ありがとうございました。