• ベストアンサー

c言語strchrのキャスト前後意味

C言語strchrkのc=(char)c の キャスト前と後のcの意味を教えてください。

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

  • ベストアンサー
  • arain
  • ベストアンサー率27% (292/1049)
回答No.5

No.1です。 別の質問で同じ内容について詳しく回答されているのでそちらのURLを記載しておきます。

参考URL:
http://okwave.jp/qa4151525.html
dreamsturb
質問者

お礼

回答ありがとうございます。 参考URLは、大変参考になりました。

その他の回答 (4)

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

> c = (char)c;の左辺値のCの値は、1バイトで型は、 > intですか、 すみません。意味がわかりません。 Cというのはどこから出てきたのでしょうか?

dreamsturb
質問者

お礼

回答、ありがとうございます。 Cは、左辺値の小文字cでint でした

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

strchrの実装における char *strchr(const char *s, int c) {  c = (char)c;  ... } のことだと勝手に解釈して回答します。 JIS X3010:2003の7.21.5.2 strchr関数から引用すると... 機能 strchr関数は, sが指す文字列の中で, c(char型に型変換する。)が最初に現れる位置を捜す。 とありますので、使用どおりcをcharに型変換しているということです。 cの値が0~SCHAR_MAXの範囲に収まっていなかった場合、unsigned charに型変換したり、0xffとのANDを取ったのでは仕様を満たすことができません。

dreamsturb
質問者

お礼

回答ありがとう御座います、今後も回答をお願いいます。

dreamsturb
質問者

補足

回答ありがとう御座います。 c = (char)c;の左辺値のCの値は、1バイトで型は、 intですか、  

回答No.2

strchrの検索文字がcharサイズで扱えない時に備えての処理だと思います。 cがintの場合・・・処理系依存(たぶん下と同じ) cがunsigned intの場合・・・charのサイズ(1バイト)だけ切り出し # 僕ならc&=0xff; と書きそう。。

dreamsturb
質問者

お礼

回答ありがとう御座います、今後も回答をお願いいます。

dreamsturb
質問者

補足

アドバイスありがとう御座います。キャスト後Cで切り出しし、わかりましたが、 左辺値Cの値は、char(1バイト)で、型intで文字列の文字の比較のためですか

  • arain
  • ベストアンサー率27% (292/1049)
回答No.1

関数は、strchr()ではなく、strchrk()ですか? それと、 >c=(char)c の キャスト前と後のcの意味を教えてください。 cは変数ですよね? であればcの型や、strchrk()(strchr()?)の使用されている前後についてもソースを記述してください。

dreamsturb
質問者

お礼

回答ありがとう御座います、今後も回答をお願いいます。

dreamsturb
質問者

補足

アドバイスありがとう御座います。関数は、strchrです、strchrのソースは、下記に書きました。  char *strch(const char *s,int c)  {   c=(char)c;    do     if(*s==c)

関連するQ&A

  • C言語の型キャスト

    C言語入門者です、よろしくお願いします C言語の型キャストについて教えてください 参考サイトで以下のようになってました char str[8] = "ABC"; char *ptr; ptr = (char*)str; printf("char型ポインタのアドレス先の値は: %s\n", ptr); この型キャストって意味ありますか? キャストしようがしなかろうがptrに収まるのはstrの先頭アドレスですよね? ただ型キャストを説明するためだけにこのような形にしているのか 意味がある型キャストなのかが解らず迷ってます

  • C言語のキャスト

    キーボード操作で見たい画像を切り替えるというプログラムを作成しようとしているのですがエラーが起きてしまい出来ません。 例えば、キーボードで「a」と押せばAの画像が出るように文字列にAの画像のファイル名を代入して画像を表示させようと思ったのですが、 const char [2]' から 'char' に変換できません。 この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。 というエラーが出てきます。 キャストという言葉は聞いたことがあるのですが、よくわかりません。 だれか教えてください。お願いします。

  • C言語のキャストについて

    お世話になります。 CRC-16の計算プログラムをC言語でつくりました。 例えば・・・1F 08 00 00 12 34 なら“1F0800001234”と入力すると【EEC2】と表示するプログラムです。 ただ・・・.Net SDKでコンパイルするとできたのですが、Visual C++2008でコンパイルするとエラーが出てしまいます。 (48) : error C2664: 'strlen' : 1 番目の引数を 'unsigned char [256]' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 (52) : error C2664: 'strtol' : 1 番目の引数を 'unsigned char [3]' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 型変換が必要ってことまではわかったのですが・・・必要なのはわかって行き詰まり状態です。。。 どのようしたらよいのでしょうか?ご教授をよろしくお願いします。 ソースは以下の通りです。 #include "stdafx.h" #include <stdio.h> #include <string.h> #include <stdlib.h> unsigned short crc_cal(unsigned short lng, unsigned char *str) { unsigned short crc, i, j, t; t= 0x0000; crc = 0xffff; for (i = 0; i < lng ; i++) { crc ^= (unsigned short) str[i]; t = (unsigned short) str[i]; for (j = 1; j <= 8; j++) { if (crc & 1) { // carry bit on crc = crc >> 1; crc ^= 0xa001; } else { // carry bit off crc = crc >> 1; } } } return crc; } int main(void) { unsigned char str[256],data[128],hexstr[3]; unsigned short crc,CRC,len; while(1) { printf("Please input key (HEX)\n"); scanf("%255s",str); hexstr[2]='\0'; for(len=0; len<(strlen(str)/2) ;len++) { hexstr[0]=str[len*2]; hexstr[1]=str[len*2+1]; data[len]=(unsigned char)strtol(hexstr, NULL, 16); } crc = crc_cal(len,data); CRC = (crc>>8) | (crc<<8); printf("\nCRC16 = %04X\n\n", CRC); } return 0; }

  • 意味がわからないエラーがあります【14歳からはじめるC言語ゲームプログラミング】

    14歳からはじめるC言語ゲームプログラミング(横スクロールアクションゲーム)をやっていて、第5章で意味がわからないエラーがでました・・・ error C2664: 'MessageBoxW' : 2 番目の引数を 'const char [25]' から 'LPCWSTR' に変換できません。 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 というもので、chap4.cppの23行目と67行目でひっかかりました。 どうすれば解決できますでしょうか。 C言語に詳しい方、よろしくおねがいします。

  • C言語のキャストについて

    C言語のキャストについて こんばんわ、質問です。 『キャスト』と言われる型を合わせるルールがあると思います。 あれはコンパイラに 「違う型の変数への代入だけど、これは意図したことですよ」 ってことを分かってもらうための手段という認識でよろしいでしょうか? コンパイル後、実行時には変数の型情報は使われない(残ってない?)と 思っていますが、その道を極めている方、教えてください。 キャストが何に使われるのか知りたいです。

  • C キャスト方法を教えてください

    C言語の初心者なのですが、 int abc(int(*read)(void*, int, int), int size, char* data); ような関数で第1引数の値をキャストするときどうすればよいですか。   int read = (????)NULL; そもそもint(*read)(void*, int, int)ってどういう意味ですか?

  • 「*」←この記号はなに?【C言語】

    http://ja.wikipedia.org/wiki/Gets このページなど、ウィキペディアなどでC言語の関数のページ(getsとかfopenとかなんでも)を見ると、形式の部分で :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::     char *gets(char *s)        :: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ↑このように*が入って説明されているじゃないですか。*はポインタの前につけるんですよね?でもgetsはポインタじゃないです。 ソースコードの例でも、 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::    char a[10];             :: ::    gets(a);              :: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ↑のように*は省かれています。 このような「*」は一体何を意味するんでしょう? 回答よろしくお願いします。

  • C#のキャスト?

    C#でのキャスト(?)で困ってます。 うまく説明できないので、下にCっぽい処理を書きます。 struct _hoge{   int i;   char c[4];   double d; }; void f(){   BYTE data[16];   stream.read(data);  // 何かから16Byte読み込み   _hoge *st = (_hoge*)data; // ←ここ   TRACE("%d,%c,%f",data->i,data->c[0],data->d); } //(結構いいかげんです) 上記処理のように、BYTEの配列で取得したデータを「struct _hoge」の型にキャストしてそれぞれの要素を取り出す、ということをC#で実現したいのですがMSDNやWebを結構探したのですがわかりませんでした。(何で検索していいのかがわかりませんでした・・・) 実現方法(もしくは検索キーワード)がわかる方、教えてください。

  • キャスト変換について

    VineLinuxでc言語を使って、カメラ画像から取得した物体の座標を別のPCのサーバープログラムにソケット通信で送信したい。 座標の変数がfloat型で格納されていて、そのX値とY値をcharでキャストして一つの変数に繋げてコード化し たいんですが、キャストの段階で数字を文字にできなくて 数字がなにかの文字やコードになってしまうので困ってます。 int x; int y; x = (char)Tbl2[1].X; y = (char)Tbl2[1].Y; printf("j - x=%c y=%c\n",x,y);

  • C言語

    C言語で int i; char message[]=\"PROGRAM\"; for(i=0; i< message[i] !=\'\\0\'; i++){ putchar(\"message[i]\"); } で、繰返し条件の i<message[i]!=\"\\0\" は、 どういう意味なのか教えて下さい。