2016-12-02 10 views
-3

unsigned charをunsigned intに変換して配列に格納する関数を作成します。しかし、これは、互換性のないポインタ型から 'sprintf'の引数1を渡すと、unsigned char(配列)をunsigned int(配列)に変換する

というエラーが発生します。

int main(void) { 
    unsigned char key[16] = "1234567812345678"; 
    phex(key, 16); //store into an array here 
} 

uint64_t* phex(unsigned char* string, long len) 
{ 
    uint64_t hex[len]; 
    int count = 0; 

    for(int i = 0; i < len; ++i) { 
     count = i * 2; 
     sprintf(hex + count, "%.2x", string[i]); 
    } 

    for(int i = 0; i < 32; i++) 
     printf(hex[i]); 

    return hex; 
} 
+0

あなたは16個の整数要素の配列をしたい、と各要素が一つだけの数字を保持していますか? – Rorschach

+3

'sprintf'は、整数を文字表現に変換します。逆順ではありません。 –

+0

A [*** sprintfとprintfの両方についての良いリファレンス](http://en.cppreference.com/w/ c/io/fprintf)が役立つはずです。 –

答えて

1

コメントは既に述べたように、あなたのコードで問題を抱えている...すべてsprintf機能の まず、あなたがそれを行うことを期待/何をしたいの全く反対のことを行います。次に、関数内にローカル変数を作成し、ポインタを返します。関数が終了すると、ポインタは無効になります。私が見る第3の問題は、あなたが何かに戻り値を割り当てることがないということです...あなたのコードを修正する方法について

命題:

unsigned* phex(unsigned char* string, long len); 

int main(void) { 
    int i; 
    unsigned char key[16] = "1234567812345678"; 

    unsigned* ints = phex(key,16); //store into an array here 

    for(i = 0; i < 16; i++) 
     printf("%d ", ints[i]); 

    //never forget to deallocate memory 
    free(ints); 

    return 0; 
} 

unsigned* phex(unsigned char* string, long len) 
{ 
    int i; 
    //allocate memory for your array 
    unsigned* hex = (unsigned*)malloc(sizeof(unsigned) * len); 

    for(i = 0; i < len; ++i) { 
     //do char to int conversion on every element of char array 
     hex[i] = string[i] - '0'; 
    } 

    //return integer array 
    return hex; 
} 
+0

'unsigned'は' unsigned int'と同じですが、後者はより明確です。また、mallocの結果をキャストしないでください。http://stackoverflow.com/a/605858/4805077 – saeleko

+0

@ LudaOtaku 'unsigned int'に同意しました。私はそれを最初に書いたことがありますし、それを短絡させるように修正しました。このように私にははっきりと分かります。 'malloc'に関するヒントをありがとう! – Rorschach

+0

私は 'unsigned'だけを書いていましたが、とにかくそれはほとんど味の問題ですが、その小さな「int」をIMOのそばに置くのがコードをもっと楽しくします。そしてあなたはmallocを歓迎します! 'void *'ポインタはCの非常に興味深い側面です。とにかくポインタをキャストしたくない場合、アドレスを切り捨てる危険性が常にあります。それは地平線のトラブルを意味します。 – saeleko

関連する問題