2009-11-16 65 views
0
#include <stdio.h> 
#include <string.h> 
#include <conio.h> 
#include <iostream> 

using namespace std; 


char a[21]; // If this is put inside the function unter -> junk output 
char* b=""; 

void unter() 
    { 
     char *new_str = ""; 


     strcpy(a, new_str); 

     char str_temp[10]=""; 
     int chnum =0, neighbor1=3, neighbor2=5, mynode=4; 

     sprintf(str_temp,"%d",chnum); 

     b = strcat(a, str_temp); 
     b = strcat(b, "_from"); 
     sprintf(str_temp,"%d",mynode); 
     b = strcat(b, str_temp); 
     b = strcat(b, "to"); 
     sprintf(str_temp,"%d",neighbor1); 
     b = strcat(b, str_temp); 


    } 

int main() 
{ 
    unter(); 
    cout << a; 
    cout << b; 
    std::cin.get(); 
} 

這是我在C代碼++。我不確定字符數組'a'與'b'是否有相同的值。此外,當我聲明'一個'內部函數unter(),我得到一些'垃圾'值(作爲輸出)。謹慎解釋如何?字符串連接查詢C++

+4

只是因爲它應該說:雖然我認爲這是明顯的,你這樣做是比生產代碼等原因,只要記住這一切被包裹在'std :: string'中。 – GManNickG

回答

3

a是一個字符數組,b是一個指向a的指針,所以在打印時它們總是打印相同的東西。當您移動的a聲明放到unter,它是當unter回報,留下b一個dnagling指針等你拿垃圾當你打印它摧毀。

+0

有道理。謝謝 – halluc1nati0n

3
b = strcat(a, str_temp); 

大概是什麼導致你的問題,因爲從strcat的()的返回值是傳遞給它,因此爲什麼你看到ab成爲平等的第一個參數,因爲b是越來越設爲該電話中的a

1

除了所提供的其它提示,則應當採取這似乎相當不合適對於b僅限定爲一個字符指針到一個字節存儲線

b = strcat(b, str_temp); 

的通知(「」定義了一個空串,即字符數組與含有「\ 0」)

所以當strcat的追加到b時,它創建了一個緩衝區溢出的單個元素。

編輯:其實我只是注意到b被指定爲指向a,(這要感謝前面提到的那一行),這樣就可以了,因爲a可能有這個空間...... It沒有任何意義,但需要這兩個變量。

也許你不明白,就是雖然strcat的()返回一個指針,這個回報並不需要「消費」,它僅僅是一個方便,當我們連鎖的命令對等。換句話說,你可以簡單地寫:

strcat(a, str_temp); 

不需要任何char * b。

+0

嗯。一天結束,我得到我想要的輸出,我想我沒事吧? – halluc1nati0n

1

當您在函數內定義a時,變量a的內存被分配到堆棧上。這個內存在函數退出時被破壞。您的指針b指向的起始地址爲a。現在,如果嘗試在函數外部訪問b,它將指向已經被破壞且包含垃圾值的內存位置。基本上,b成爲一個懸掛指針。

1

如果您在unter()函數內部聲明a,那麼它僅在該函數內有作用域。試圖從功能之外打印b將打印垃圾,因爲它指向a這是已經被破壞。

這就是爲什麼你應該始終確保不從全球一個指向一個局部變量一個典型的例子。

2

的strcat()返回並置運算的結果,所以

b = strcat(a, str_temp); 

結果b指向的數組a []。隨後的strcat()操作有效地執行相同的操作,因此最終的結果是b按照您的觀察指向了[]。如果在unter()中聲明瞭一個[],它將具有局部範圍到該函數,結果是在您退出調用unter()之後,全局變量b將指向隨機/未定義的內存內容。

這是輕度值得注意的是,你做了很多,可能與

sprintf(a, "%d_from%dto%d", chnum, mynode, neighbor1); 
2

更容易實現你可以做整個級聯和sprintf在單行的工作。

char* b=""; 
void unter() 
    { 
     int chnum =0, neighbor1=3, neighbor2=5, mynode=4; 
     char str_temp[21]; 
     sprintf(str_temp,"%d_from%dto%d", chnum, mynode, neighbor1); 
     b = new char[strlen(str_temp)+1]; 
     b = strcpy(b, str_temp); 
    } 

只有有趣的事情是,你必須記得刪除b完成後。另一種選擇是直接使用緩衝區和sprintf它:

char a[21]; 
void unter() 
    { 
     int chnum =0, neighbor1=3, neighbor2=5, mynode=4; 
     char str_temp[21]; 
     sprintf(a,"%d_from%dto%d", chnum, mynode, neighbor1); 
    }