2016-05-16 11 views
0

I2Cメッセージシステムの文字列に値を連結するC++コードを作成しています。私はメッセージが正しく働いているが、文字列を連結すると、コードは文字列に必要な3つの値以上の連結を間違ってしまいます。私が書いたコードは以下の通りです:2つのアドレス値は、2つのASCII文字がどこにあるか文字列連結中に余分な文字が追加されました

concatint(5, ' ', ' '); 

void concatint(int value1, char address1, char address2) 
{ 
    int alive1 = static_cast<int>(address1); 
    int alive2 = static_cast<int>(address2); 
    char* alive3 = (char*)malloc(sizeof(address1)); 
    char* alive4 = (char*)malloc(sizeof(address2)); 
    //alive3 = address1; 
    //alive4 = address2; 
    sprintf(alive3, "%2d", address1); 
    sprintf(alive4, "%2d", address2); 
    if (value1 < 10) 
     readlength = 1; 
    if (value1 >= 10 && value1 < 100) 
     readlength = 2; 
    if (value1 >= 100 && value1 < 1000) 
     readlength = 3; 
    if (value1 >= 1000 && value1 < 10000) 
     readlength = 4; 
    if (value1 >= 10000 && value1 < 100000) 
     readlength = 5; 
    if (value1 >= 100000 && value1 < 1000000) 
     readlength = 6; 
    if (value1 >= 1000000 && value1 < 10000000) 
     readlength = 7; 
    if (value1 >= 10000000 && value1 < 100000000) 
     readlength = 8; 
    *writedata = 0; 
    itoa(value1, writedata, 10); 
    strcpy(writeaddress, &address1); 
    strcat(writeaddress, &address2); 
    strcat(writeaddress, writedata); 
    strcpy(readaddress, address1); 
    strcat(readaddress, address2); 
    typevalue = 1; 
} 

この関数は、入力されています。

このコードの結果は次のようになります。 '' '5 ASCii文字を値の前に連結しています。私は、コードを実行したときしかし、私が得る結果は次のとおりです。

" \005 \0055" 

私のコードは私の文字の間に余計な文字を連結しているようだと私は上記のコードがそれを加えるところを確認していません。私はコードを踏んできたので、問題はどこにあるのか分かりません。

+1

あなたは 'C++ 'を使用できますか?これは(cstrings、mallocおよびcstring関数を使用して) 'C++ 'を使用するときにはこれを行う方法ではありません。 – drescherjm

+4

'std :: string'を使ってください。お願いです。 – erip

+1

使用している未定義の変数は何ですか?それらはどこに定義されていますか?彼らはどのように初期化されますか? '-128'から' 127'( '' char'の符号性に依存して '0'から' 255')までではないことがわかっているとき、 'value1'のような大きな範囲を調べているのはなぜですか?そして最後に、あなたは 'value3'と' value4'をどこで自由にしますか? –

答えて

4

最初の8行は、未定義の動作を持っています。さらに、

void concatint(int value1, char address1, char address2) 
{ 
    int alive1 = static_cast<int>(address1); 
    int alive2 = static_cast<int>(address2); 
    // Note that address1 is a char, not a char*, and as such sizeof(address1) 
    // is guaranteed to be 1. Thus we allocate one byte of storage. 
    char * alive3 = (char*) malloc(sizeof(address1)); 
    char * alive4 = (char*) malloc(sizeof(address2)); 
    // Here we write two digits and a terminating NUL to that one byte 
    // => undefined behaviour. Cannot reason further about the program. 
    sprintf(alive3, "%2d", address1); 
    sprintf(alive4, "%2d", address2); 

strcpy(writeaddress, &address1); 

はどちらか動作しません。 address1は1文字です。 &address1はこの文字へのポインタですが、それに続くNUL文字がないため、strcpyに渡す有効なポインタではありません。

使用std::string

関連する問題