使用 strncpy 时出现异常

Posted

技术标签:

【中文标题】使用 strncpy 时出现异常【英文标题】:Exception when using strncpy 【发布时间】:2009-08-14 12:17:19 【问题描述】:

以下代码片段在执行strncpy函数时以异常结束:

#define MAX_FILENAME_LEN 127

typedef struct 
unsigned long nameLength;
char name[MAX_FILENAME_LEN + 1];
 filestructure;

char *fileName;

strncpy( fileName, filestructure->name, MAX_FILENAME_LEN );
*( fileName + MAX_FILENAME_LEN+1 ) = 0; 

Ayone 知道会出什么问题吗?在文件结构中,我有一个长度为 50 个字符的文件名,因此它在范围内......我真的有点迷失了可能导致这个简单代码片段出现问题的原因......

【问题讨论】:

使用 std::string 除非你有很好的理由。 “例外”?您正在使用 C 函数,而 C 没有异常。无论如何,在询问您遇到的错误时,描述错误有时会有所帮助。 您遇到了哪个异常? @jalf:可能是操作系统异常,可能是访问冲突。 有趣的是,这段代码看起来很像一些“克劳斯”提出的***.com/questions/1265117/structure-problem-in-c/… 中第一个答案的副本。我怀疑“罗伯特”和“克劳斯”是同一个人。 【参考方案1】:

您没有为目标缓冲区分配空间,fileName 未初始化。所以你尝试复制某处。您应该分配内存,然后再释放它。

char *fileName = new char[MAX_FILENAME_LEN + 1];
strncpy(...);
*(...) = 0;
doStuffWithTheBuffer( fileName );
delete[] fileName;// free memory

此外,如果您有一个大小为 N + 1 的缓冲区,并且希望最多复制 N 个字节并以空值终止您应该这样做的缓冲区

*(buffer + N) = 0;

【讨论】:

【参考方案2】:

您的问题被标记为 C++,但代码是纯 C。您为什么要这样做?事实上,C 字符串处理并不是那么容易掌握(即使对于掌握它的程序员来说,偶尔出错也不是那么罕见)正是 C++ 让你不用。

如果您正在编写 C++,请使用 C++ 方式。使用std::string。老实说,它会让你节省很多时间来调试这样的代码。

【讨论】:

【参考方案3】:

您没有为文件名分配空间。要么做

filename = malloc (MAX_FILENAME_LEN * sizeof(char));

filename = strndup (filestructure->name, MAX_FILENAME_LEN);

【讨论】:

malloc??在 C++ 应用程序中。请使用新的

以上是关于使用 strncpy 时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

strncpy函数使用

strncpy()函数的功能

strncpy()函数的功能

strncpy的用法

为啥要使用 strncpy 而不是 strcpy?

在结构上使用 strncpy