2012-02-20 84 views
-2

我有兩個不同的文件名,其在頭文件中定義:在c中減少字符串長度,哪裏出錯?

1: 「physio_sensor_readout.csv」 2: 「statethresh_configuration.csv」

它們由

char* filename; 

初始化和更高版本

filename = FILENAMEINAMACRO; which is the corresponding filename above 

後來,filename被傳遞給另一個改變結尾的函數:

filename[strnlen(filename, FILENAME_LENGTH) - 4] = '\0'; 

這應該刪除結尾.csv和我strncat後新的一個。 FILENAME_LENGTH是60,所以足夠的空間。

它的工作原理,如果我通過 「statetresh _....」(連strncat函數之後),但與 「physio_se .....」。這將引發部分故障的情況下,1

strnlen(filename,FILENAME_LENGTH - 4) 

回報21和25的情況下,2,這是點,在這裏我想提出終止空的正確位置。

這是用的char *一個問題,我應該初始化文件名​​以字符文件名[60]?

的問候,並感謝您

編輯:

您的建議解決了這個問題。謝謝!

+0

看起來'FILENAMEINAMACRO'可能是一個帶引號的字符串,因此您試圖修改字符串文字,這是未定義的行爲。將'filename'改爲數組,並使用'strcpy'(或'strncpy',它不僅僅是'strcpy'的保存版本)將其放入。 – 2012-02-20 14:55:37

+0

這可能是他們所說的,但爲了以防萬一, strnlen(filename,FILENAME_LENGTH) - 4'與'strnlen(filename,FILENAME_LENGTH - 4)不一樣' – 2012-02-20 14:57:31

+0

這裏有什麼確切的問題?是不是strnlen函數返回正確的值? – jlemos 2012-02-20 15:03:57

回答

2

認爲你聲明FILENAMEINAMACROstring literal [沒有更多的代碼,我不能確定它]。

字符串文字可能保存在只讀存儲器中 - 因此您可能無法更改它們。

以任何方式嘗試更改字符串文字都會導致未定義的行爲。

你可能想使FILENAMEINAMACRO副本,並使用strcpy()

2

它是不安全的修改字符文字的內容進行這項工作。事情是這樣的:

char *filename = "yes"; 
filename[2] = 'p'; // change to "yep" 

是不確定的行爲,並可能導致災難性的後果,因爲filename可以指向內存不能被修改。相反,嘗試這樣的事:

char filename[] = "yes"; 
filename[2] = 'p'; // change to "yep" 

這將分配一個新的數組filename並初始化其內容與"yes"

0

你似乎把你的char *指針filename指向一個字符常量。我假設你已經定義了#define FILENAMEINAMACRO "physio_sensor_readout.csv"。這使得你的任務filename = "physio_sensor_readout.csv";。然後使用文件名指針來修改字符串常量。這裏是一個更適合的序列:

char filename[256]; // choose a size that is suitably large 
... 
strcpy(filename, FILENAMEINAMACRO); // also look at strncpy for safer copying 
... 
... manipulate the content of filename as you wish ... 

因爲你所做的字符串拷貝文字,修改它是安全的(只要你留的filename聲明大小的範圍內 - 包括保留任何也應該在範圍內終止null

你應該小心使用char filename[] = "..."表單,它爲你賦予的字符串字面量分配足夠的空間,但如果你稍後將某些其他字符串文字複製到該空間中,那麼必須確保第二個字面不再比第一個字面大,一個更安全的做法是將空間尺寸設置得足夠大,以確保代碼永遠不會嘗試再使用比你的尺寸。如果您接受來自程序外部的輸入(或來自其他人的代碼),則應在嘗試將其複製到您已標註的空間之前檢查您接受的內容的長度。任何超出尺寸大小的空間使用都可能導致難以診斷的問題。在上面的示例中,您必須盡一切努力確保您永遠不會使用比256個字符更多的空間(包括終止nul字符)(因爲文件名的尺寸爲200)。