2016-05-16 150 views
0

我正在研究將值連接成一串字符的I2C消息系統的C++代碼。我的消息正確解決了,但是當我將字符串連接在一起時,代碼不正確地將我想要的三個值連接到字符串上。我所編寫的代碼是下面:在字符串連接期間添加的額外字符

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; 
} 

此函數具有的輸入:

concatint(5, ' ', ' '); 

其中兩個地址值是兩個ASCII字符。

此代碼的結果應該是:''''5與值之前的ASCii字符連接在一起。然而,當我運行代碼,結果我得到的是:

" \005 \0055" 

我的代碼似乎在我的人物之間串聯一個額外的性格和我不知道在我的上面的代碼補充說。我已經通過了代碼,一切都應該正常工作,不知道我的問題在哪裏。

+1

您允許使用'C++'嗎?這(使用cstrings,malloc和cstring函數)當然不是在使用'C++'時做這件事的方法。 – drescherjm

+4

請使用'std :: string'。我求求你。 – erip

+1

你正在使用的所有未定義變量是什麼?他們在哪裏定義?他們是如何初始化的?當你知道它不能超過'-128'到'127'(或者'0'到'255',取決於'char'的符號)時,你爲什麼要檢查'value1'的大範圍?最後,你在哪裏免費的''value3'和'value4'? –

回答

4

的前八行有不確定的操作:

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是單個字符。 &address1是一個指向這個字符的指針,但是它後面沒有尾隨的NUL字符,所以它也不是一個有效的指針傳遞給strcpy

使用std::string

相關問題