プロが教える店舗&オフィスのセキュリティ対策術

プログラム初心者です。現在、下のようなプログラムを作成して文字列をprintf出力しております。現状、文字列データの一部(何バイト目からここまでとか)を他の場所に抽出や取得をしたいのですが、それが出来なく大変困っています。
文字列の取得例)
aaaa.aa|xxx.xx|yyyy.yy|iiii
今、取得したい部分はx,y,iの部分で、文字数は100文字出力させております。

inti,loop;
charsendValue[100];
charreadValue[100];
intret;
intloopCnt;

loopCnt = 0;
ret = 0;
strcpy(sendValue,sendMsg);


printf("send\n");

for(i=0;i<len;i++){
write(fd,&sendValue[i],1);
usleep(50000);
}

while(1){
      ret = read(fd,readValue,100);
printf("read-ret:%x\n",ret);
if(ret!=0xffffffff){
printf("readValue(%s):",ret);
for(i=0; i<ret; i++){
printf("%02X ",readValue[i]);
}
printf("\n");

return 0;


こんな感じです。ご教示お願いいたします。

A 回答 (1件)

その「抽出したい」というのがどんな条件で、どんな風にやりたいのかがはっきりしないのですが。


単純には

while(i=0;抽出元が区切り文字?になるまで,または抽出する文字数まで; ++ i){
抽出結果[i]=抽出元[i+抽出開始の添字] ;
}
抽出結果[抽出した最後+1]='\0' ;

となるでしょう。場合によってはstrtokとかsscanfとかも有用でしょう。


あと、細かいようですが。

> if(ret!=0xffffffff)

このreadがシステムコールのものなら、今あなたが使っている環境では正しく動作するかもしれませんが、常に正しいとは限りません。
標準のCなら、マニュアルには「戻り値は読み込んだ文字数/失敗したら負の値」って書いてないですか?
環境によっては(例えば、intが64bitのCだったら) 0xfffffffff は「正」なので「失敗とは限らない」し、失敗で返ってくるのも必ず-1とは限らないです。

> printf("readValue(%s):",ret);
retはint型です。%sはcharへのポインタを要求します。
Cではprintfの中の型の不一致はエラーにはなりません。しかし、結果として致命的なエラーになるケースはあります。
この場合だと、retに入っている「文字数」を、「文字列が始まるアドレス」と解釈されてしまい、不正はエリアにアクセスしてしまうかもしれません。
    • good
    • 0
この回答へのお礼

わざわざご丁寧に質問以外の点までご回答いただきましてありがとうございます。大変助かりました。
参考にさせていただきます。ありがとうございました。

お礼日時:2011/10/01 22:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!