【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19507

UNIXでの文字列を16進に変換
投稿者---よしだ(2005/01/26 15:31:40)


sscanfで文字列を16進に変換したいのですが、
VisualCで実行すると正常に動くのですが、UNIX上ではバスエラーが発生してしまいます。
何か違う記述をしないといけないのでしょうか?
ご教授ください。よろしくお願いします。

int main()
{
int ret;

char AAA[4]="2020";
char BBB[2] ={0x20,0x20};
ret=sscanf( AAA, "%02x%02x", &BBB[0], &BBB[1] );
}


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:UNIXでの文字列を16進に変換 19508 επιστημη 2005/01/26 15:36:12
<子記事> Re:UNIXでの文字列を16進に変換 19509 だん 2005/01/26 15:36:28
<子記事> Re:UNIXでの文字列を16進に変換 19513 tetrapod 2005/01/26 16:22:37


No.19508

Re:UNIXでの文字列を16進に変換
投稿者---επιστημη(2005/01/26 15:36:12)


> char AAA[4]="2020";
> char BBB[2] ={0x20,0x20};
> ret=sscanf( AAA, "%02x%02x", &BBB[0], &BBB[1] );

末尾に'\0'が付くので、AAA[5]じゃないと溢れませんか?



この投稿にコメントする

削除パスワード

No.19510

Re:UNIXでの文字列を16進に変換
投稿者---よしだ(2005/01/26 16:07:55)


>> char AAA[4]="2020";
>> char BBB[2] ={0x20,0x20};
>> ret=sscanf( AAA, "%02x%02x", &BBB[0], &BBB[1] );
>
>末尾に'\0'が付くので、AAA[5]じゃないと溢れませんか?

回答ありがとうございます。
しかし、結果は変わりませんでした・・・


この投稿にコメントする

削除パスワード

No.19509

Re:UNIXでの文字列を16進に変換
投稿者---だん(2005/01/26 15:36:28)


ret=sscanf(AAA,"%02x%02x",BBB[0],BBB[1]);
だと思うのですが...


この投稿にコメントする

削除パスワード

No.19511

Re:UNIXでの文字列を16進に変換
投稿者---よしだ(2005/01/26 16:08:52)


>ret=sscanf(AAA,"%02x%02x",BBB[0],BBB[1]);
>だと思うのですが...

回答ありがとうございます。
しかし、セグメント例外エラーになってしまいました・・・


この投稿にコメントする

削除パスワード

No.19513

Re:UNIXでの文字列を16進に変換
投稿者---tetrapod(2005/01/26 16:22:37)


%x の相方は unsigned int でなければなりません。
unsigned int BBB[2]; にすれば動くでしょう。
VC++ でも正しい値は得られなかったはずです。



この投稿にコメントする

削除パスワード

No.19522

Re:UNIXでの文字列を16進に変換
投稿者---円零(2005/01/26 20:27:06)


>%x の相方は unsigned int でなければなりません。
>unsigned int BBB[2]; にすれば動くでしょう。
>VC++ でも正しい値は得られなかったはずです。

それですね。もっともVC++/Windowsの場合、[0]から順番に格納している限りは
問題は表面化しないようです。まあ後ろは破壊されてるんですが。

メモリダンプしてみるとわかりやすいかもしれません。
#include <stdio.h>

void memorydump(char *p, int searchrange){
    int i, m = (int)p % 16;

    printf("         +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +f\n");
    printf("%08x", (int)p - m);
    for(i = 0; i < m; i++)printf("   ");

    for(i = 0; i < searchrange; i++){
        printf(" %02x", (unsigned char)*p);
        p++;
        m++;
        if(m >= 16){
            printf("\n%08x", (int)p);
            m = 0;
        }
    }
    printf("\n\n");
}

int main(void){
    int ret;
    char AAA[7] = "512641"; 
    char BBB[3] = {0x20, 0x20, 0x20};

    printf("&BBB[0] = %p, &BBB[1] = %p, &BBB[2] = %p\n\n", &BBB[0], &BBB[1], &BBB[2]);
    memorydump(BBB, 32);
    printf("sscanf実行\n\n");
    ret = sscanf(AAA, "%02x%02x%02x", &BBB[0], &BBB[2], &BBB[1]);
    memorydump(BBB, 32);
    return 0;
}
もしかすると環境依存のコードかも知れませんが参考までに。


>ret=sscanf(AAA,"%02x%02x",BBB[0],BBB[1]);
これは、何かの勘違いだと思います。



この投稿にコメントする

削除パスワード

No.19533

Re:UNIXでの文字列を16進に変換
投稿者---よしだ(2005/01/26 22:59:06)


>>%x の相方は unsigned int でなければなりません。
>>unsigned int BBB[2]; にすれば動くでしょう。
>>VC++ でも正しい値は得られなかったはずです。
>
>それですね。もっともVC++/Windowsの場合、[0]から順番に格納している限りは
>問題は表面化しないようです。まあ後ろは破壊されてるんですが。
>
>メモリダンプしてみるとわかりやすいかもしれません。
><pre>#include <stdio.h>

void memorydump(char *p, int searchrange){
int i, m = (int)p % 16;

printf(" +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +f\n");
printf("%08x", (int)p - m);
for(i = 0; i < m; i++)printf(" ");

for(i = 0; i < searchrange; i++){
printf(" %02x", (unsigned char)*p);
p++;
m++;
if(m >= 16){
printf("\n%08x", (int)p);
m = 0;
}
}
printf("\n\n");
}

int main(void){
int ret;
char AAA[7] = "512641";
char BBB[3] = {0x20, 0x20, 0x20};

printf("&BBB[0] = %p, &BBB[1] = %p, &BBB[2] = %p\n\n", &BBB[0], &BBB[1], &BBB[2]);
memorydump(BBB, 32);
printf("sscanf実行\n\n");
ret = sscanf(AAA, "%02x%02x%02x", &BBB[0], &BBB[2], &BBB[1]);
memorydump(BBB, 32);
return 0;
}
</pre>もしかすると環境依存のコードかも知れませんが参考までに。
>
>
>>ret=sscanf(AAA,"%02x%02x",BBB[0],BBB[1]);
>これは、何かの勘違いだと思います。

よくわかりました。
ありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧