2012-02-20 63 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)。