• ベストアンサー

'\200'って何?

strcmpを実装してみようと調べてみると、文字コードの比較は unsigned charで行わないといけないと書いてありました。 それは'\0'と'\200'の比較を考慮してということだったんですが、 後者の意味がわかりません・・。 一応文字コードを表示させてみると-128、unsigned charで128でした。 この文字コードは一体何を意味するのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> unsignedで比較しなければならないことには変わりないのでしょうか? これはその通りです。

Directxq
質問者

お礼

ありがとうございました。

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> それは'\0'と'\200'の比較を考慮してということだったんですが、 その情報をどこで入手したのか分かりませんが、strcmpが各文字をunsigned charとして比較しなければならないことと直接の関係はありません。 各文字を、符号付きとして扱う場合と符号無しとして扱い場合では、0~SCHAR_MAXの範囲に収まらない文字が含まれる場合の比較結果が異なることはお分かりかと思います。 しかし、char型のビット数はCHAR_BITマクロで定義される値であり、標準では8以上としか規定されていません。したがって、'\200'という特定の値は関係ありません。

Directxq
質問者

お礼

ご回答ありがとうございます。 入手先は http://libc.blog47.fc2.com/blog-entry-33.html http://www.bohyoh.com/CandCPP/C/Library/strcmp.html 特に'\200'の話が出てきたのは http://www.jp.freebsd.org/cgi/mroff.cgi?sect=3&cmd=&lc=1&subdir=man&dir=jpman-6.0.0%2Fman&subdir=man&man=strcmp です。 -128が128となるということはわかりました。 ご回答をふまえ、unsignedで比較しなければならないことには変わりないのでしょうか?

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

'\177' と '\200'を比較する場合 signed charの場合 127 > -128 unsigned charの場合 127 < 128 と結果が違ってしまうのです 8進数の'\200' 16進数で '\x80'は符号の切り替わる文字コードです

Directxq
質問者

お礼

ご回答ありがとうございます。 なるほど8進数表記だったわけですね・・。 ありがとうございます。よくわかりました。

関連するQ&A

  • 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);  

  • C言語 strcmp 半角スペースがあるとだめ?

    C言語 strcmp 半角スペースが文字列に含まれている場合 文字列の比較がうまくいきません。半角スペースがあると比較できないのでしょうか? プログラム //strcmp #include <stdio.h> #include <string.h> int main(void){ char input[256]; char str[] = "HelloWorld!";   //char str[] = "Hello World!";だとうまくいかない。 printf("%s\n>", str); scanf("%s", input); if ( strcmp(input, str) == 0){ printf("同じです。\n"); }else{ printf("違います。\n"); } return 0; }

  • -1 はいくつ

    下記 C プログラムを実行しました。 printf ("char:%x\n",(char)-1); printf ("unsigned char:%x\n",(unsigned char)-1); 前者では -1 が ffff、後者では -1 が ff と出力されました。どうしてこうなるのでしょう。私の C コンパイラのムシでしょうか。

  • ポインタ…(゜Д゜≡゜Д゜)?

    え~C言語初心者です。 ポインタ、文字列等の比較を教えて下さいm(._.)m ペコッ 下記ソースでおかしいところがあれば指摘お願いします。 (1)数値の比較  int i = 10;  if(i == 10){処理} (2)文字の比較  char c = 'c';  if(c == 'c'){処理} (3)文字列の比較  char *c = "abc";  if(c == "abc") {処理}   ↑これだとポインタと文字列の比較になるんですよね?  if(0 == strcmp("abc",c)){処理}   ↑この書き方で問題ないのでしょうか?  if(0 == strcmp("abc",*c)){処理}                ~~  だとダメなのでしょうか? ※int型のポインタを使う場合  int *i = 0;  if(0 == *i){処理}   になるのでしょうか?

  • 構造体の宣言について

    今解析しているC言語のプログラムで以下の様な構造体の宣言があります。 typedef struct { unsigned char :3; unsigned char aaa :1; unsigned char bbb :1; unsigned char ccc :1; unsigned char ddd :1; unsigned char eee :1; } tTSR ; :3や:1の部分の意味がわかりません。 御存知の方ご回答よろしくお願いします。

  • char形のポインタの内容は(基本情報16年午後第6問に関して)

    こんにちは。 基本情報技術者の16年秋午後6問に 次の記述がありました。 void URLEncode(unsigned char *input ,unsigned char *output){ const unsigned chars[]="0123456789ABCDEF"; (省略) *output++=chars[*input>>]; *output++=chars[*input&0x0f]: このような記述ですが、 *inputは文字のはずです。 そのまま数字(文字コード)かのように、 ビット演算できるのでしょうか。 キャストか、文字コードに変換する 作業が必要になりませんか。 C言語は詳しくありません(JAVA選択です)。 それでも、少し気になりましたので、 何かアドバイスできる人がいましたら、 よろしくお願いします。

  • read()で読みこんだ文字列の比較について

    実行環境はLinuxで、ディストリビューションはturboLinuxです。 strcmpで文字列の比較ができるのですが、何故かreadで読み込んだ文字列は比較できません。 何故なのでしょうか。ちなみにコードは下です read(sock_ipadrc,&Buf,sizeof(Buf)); if(!strcmp("GETADR",Buf)){ printf("等しい"); }

  • gccの最適化オプションで挙動がおかしくなる

    コンパイラの最適化オプション -Osをつけると、下記のソースの終了コードが255になってしまいます。 最適化を行わない時や最適化を-O1にしたときは、0を返します。 本来は0が返ると思うのですが、なにかコードの書き方に何か問題ありますでしょうか? 環境は、 gcc 4.2、Mac Xcode 3.1.4上でテストしています。 また、ソースの文字コードの種類はSJISにしています。 const unsigned char gStr[3]="\x82\xAC"; int main(int ac, char **av) {  const unsigned char cc=0x82;  if(gStr[0]==cc)   return 0;  else   return 0xff; }

  • 配列へのプラス?

    C++のコードを読んでいるところなのですが、 配列に プラスされているコード部の意味がわからずこまっております。 ********************************* unsigned char data1[32]; unsigned char data2[8]; ※ここでdata1, data2に値入力処理 if(memcmp(data1 + 2, data2, 8) != 0){  //処理X } ********************************* 上記のようなコードの「data1 + 2」の部分がよくわかりません。 byte配列にプラスされている2は、数値なのでしょうか?? C++は普段使わないもので、、、呆れるほどアホな質問だとしてもご了承ください。。 どなたかご教授ねがいます。 よろしくお願いいたします。

  • if( strcmp( 引数, 引数 )=== 0

    サンプルで、 if( strcmp( 第1引数, 第2引数 ) === 0 ){ て書いてあるコードを見たのですが、 この === 0 には、どういう意味があるのでしょうか? (==0とはどう違うのでしょうか? という意味です) 試しに、型の一致を確認できるのかな? と思いやってみたのですが、 うまくいきませんでした。 $a = "10"; $b = 10; if( strcmp( $a, $b ) === 0 ){ print "2つの文字列は同じです!"; } else { print "2つの文字列は違います"; } strrposの返り値判定に「===」を使うのだったら、 意味は分かるのですが、 それとは意味合いが違うような (strcmpに===を使う意味はないような)気もするのですが…

    • ベストアンサー
    • PHP

専門家に質問してみよう