2017-03-18 64 views
0

我有一個名爲SearchArray()的函數,它調用名爲SearchRecords(char StudentNo [])的另一個函數來檢查gRecs的數據庫數組以查找學生數字中的匹配項。編譯器向我的字符數組添加隨機字符

當我運行調試器時,如果StudentNum = "12345678"的StudentNo的值顯示爲StudentNo = 0x22fde0 "12345678"。 這些附加字符是什麼?

SearchArray()函數

void SearchArray(){ 
    char studentNum[8]; 
    cout << "Enter student number: "; 
    cin >> studentNum; 

    char i = SearchRecords(studentNum); 
    if (gRecs[i].studentNumber != studentNum){ 
     cout << "Record not found" << endl; 
    } 
    else { 
     PrintRecord(i); 
    } 
} 

SearchRecords()函數

int SearchRecords(char StudentNo[]) 
{ 

for (int i = 0; i < gNumRecs; i++){ 
    if(gRecs[i].studentNumber == StudentNo) 
    { 
     return i; 
    } 
} 
return -1; //not found 
} 
+0

你在哪裏看到其他字符? – Telokis

+0

當我使用調試器來測試代碼..當我運行它時,即使有匹配,由於這些額外的字符,它不能識別... – Stefan

+2

這些額外的字符:0x22fde0?這是'StudentNo'的地址。 – user4581301

回答

1

你的意思是 「0x22fde0」?這些不在你的字符數組中,你的字符數組只包含引號部分(「12345678」)。十六進制數字0x22fde0是第一個字符的地址。在C/C++中,任何數組實際上只是指向第一個元素的指針:變量的值是第一個元素的地址。所以調試器顯示你的地址值。但是它也知道字符數組通常存儲字符串,所以它也有助於將該數組的內容顯示爲字符串。

+0

我明白了!好吧,有道理..謝謝。 – Stefan

+0

...關於C和C++中數組的常見問題是,在大多數情況下,_converted_指向它的第一個元素。數組本身是一個數組。 –

1

由於這個comment筆記,你比較指針而不是字符串。通過將您的studentNumber類型更改爲std :: string,您可以節省很多頭痛。這將允許您在右側使用std :: string或原始字符串(char *)使用比較運算符(==,!=,<,< =,>>,> =)。我強烈建議您閱讀tutorialspoint.comcplusplus.com的字符串。

在將來發布時,請發佈任何相關的自定義數據結構(例如您的gRecs元素類型的佈局),這有助於我們更快地解決問題。

+0

感謝您的建議,將會做到。 – Stefan