使用 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 时出现异常的主要内容,如果未能解决你的问题,请参考以下文章