2016-12-08 41 views
-2

注:我無法發佈任何代碼,因爲它是我正在執行的任務的一部分。當它作爲參數傳遞給方法時,從字符串中刪除空終止符,

現在,我有這樣的事情

int main(){ 
    char buf[30]; 
    // Code that reads input and assigns it to buf 
    // Adds null terminator to the end of the buf 
    foo(buf); 
} 

void foo(char * buf){ 
    // Do something 
} 

然而,當我調試我注意到BUF的foo中的值具有字符串但不是空終止。我使用strcmp比較buf和foo()方法中的另一個字符串,我懷疑這是我的代碼中存在錯誤的原因。

任何想法爲什麼會發生這種情況? (對不起,我對C仍然很不好)

+4

這沒有發生。其他事情正在發生。我們無法確定它是什麼,因爲您不會發布您的代碼。 –

+0

您完全刪除了代碼中可能存在問題的部分。你用什麼來閱讀輸入?該方法是添加一個NUL終止字節(很多)嗎?還是您希望添加它?輸入讀取函數的返回值是多少?它是否返回讀取的字節數?也許它返回一個指向字符串中第一個字節的指針?考慮使用'buf [30] = {0}'初始化'buf'。另外,考慮檢查緩衝區溢出。 – Myst

+0

你描述的是*非常*不太可能。如果''NUL'在'main'中終止,那麼在'foo'中它仍然是這樣,除非你有一些奇怪的緩衝區溢出問題。更可能的是,它從來沒有正確的'NUL'終止。你需要在'main'中提供實際的代碼,因爲這是問題所在。 – ShadowRanger

回答

0

我在猜測你提供的信息量,但看起來你的緩衝區在堆棧中,它從來沒有清除過。很可能你有一些垃圾。你應該用零來初始化你的緩衝區。這裏有幾種方法可以做到這一點。

  1. buf[] = {0};
  2. memset(buf, 0, sizeof(buf));

記住,當你聲明一個變量將與任何值是堆棧在那個特定的時間該位置上進行初始化。在使用它們來消除引入未定義行爲的可能性之前,您應該將所有變量初始化爲已定義的狀態。從您提供的信息有限,看起來這是您的問題。

相關問題