2012-04-07 58 views
0

我想從我的本地函數中發送從主要另一個字符數組中複製數據,我總是看到垃圾字符,即使我已經添加'\0'在字符串。正在存儲在數組中的垃圾字符

這是我的部分代碼。

for (int i = 0; i < strlen(main) ; i++){ 
    if (main[i] != ';'){ 
     local[i] = main[i]; // Copy the characters until `;` isn't found 
    } else { 
     local[i] = '\0' ; // If `;` found, null terminate the copied destination. 
     break; 
    } 
} 

所以基本上的數據是從主送比如像這樣

look;can;you;see;me

My Local-----> 'look??y??>c?Lw?T?w??>c?2+a?' 
Actual data in main---> 'look' 

正如你可以從上面的例子中看到我想只得到第一個字我總是得到垃圾,我不知道爲什麼?

編輯

這是它幾乎100%可以肯定,是造成我的問題的整體功能。

void myFunction(char main[ ]){ 


    for (int i = 0; i < strlen(main) ; i++){ 
    if (main[i] != ';'){ 
     local[i] = main[i]; // Copy the characters until `;` isn't found 
    } else { 
     local[i] = '\0' ; // If `;` found, null terminate the copied destination. 
     break; 
    } 
} 


     if(main[i] != '\0'){ 


      int col = 0, row = 0; 

      do { 
       if(main[i] == ';' || main[i] == '\0') { 
        sending[row++][col] = '\0'; 
        col = 0; 
       } else { 
        sending[row][col++] = main[i]; 
       } 
      } while(main[i++] != '\0'); 

     } 



    } 
+0

你可以添加你用來打印MyLocal的代碼嗎? – Mat 2012-04-07 06:05:34

+0

@Mat這是來自我沒有訪問它的主要功能,我忘了提及這是一個家庭作業。我會添加標籤對不起。 – Ali 2012-04-07 06:06:55

+0

您發佈的代碼看起來不錯(如果潛在效率低下)。所以我們需要看到更多。 – Mat 2012-04-07 06:07:47

回答

3

你忘了照顧零終止字符串,如果;是不是找到。一個簡單的修正爲環調整你的所以它也認爲,在主要的\ 0:

for (int i = 0; i <= strlen(main); i++) { 
+0

哇我的第一部分解決了我的問題。現在我在代碼的第二部分遇到了問題,哈哈得看看自己再次發現什麼是錯誤的。 – Ali 2012-04-07 06:24:30

1

標準庫爲您處理此。使用strchrstrncpy

size_t length = std::strlen(main); 
const char* current_pos = main; 
for (int i = 0; ; ++i) { 
    size_t chars_remaining = length - std::distance(main, current_pos); 
    const char* end_of_field = std::strchr(current_pos, ';'); 
    if (end_of_field == NULL) { 
     std::strncpy(local[i], current_pos, chars_remaining + 1); 
     // we're at the end of the input 
     break; 
    } 
    else { 
     size_t field_length = std::distance(current_pos, end_of_field); 
     std::strncpy(local[i], current_pos, field_length); 

     // don't forget to NUL-terminate the string 
     local[i][field_length] = '\0'; 

     // go to next character for the next iteration through loop 
     current_pos = end_of_field + 1; 
    } 
} 

就個人而言,我更喜歡std::findstd::copy(從<algorithm>):

size_t length = std::strlen(main); 
const char* current_pos = main; 
for (int i = 0; ; ++i) { 
    size_t chars_remaining = length - std::distance(main, current_pos); 
    const char* end_of_field = std::find(current_pos, current_pos + chars_remaining, ';'); 
    char* output_end = std::copy(current_pos, end_of_field, local[i]); 

    // don't forget to NUL-terminate the string 
    *output_end = '\0'; 

    // if we're at the end of main, then we're done; 
    // we're at the end if we're on a NUL character 
    if (*end_of_field == '\0') 
     break; 

    // go to next character for the next iteration through loop 
    current_pos = end_of_field + 1; 
} 

不是我曾經寫過的最漂亮的代碼,但是這主要是由於使用C語言風格字符串和指針算術,在原始問題中看起來不可避免。另外,我還沒有對溢出進行必要的檢查。做到這一點很容易,但使用std::vector<std::string>更容易,並讓標準庫爲您擔心。