我正在学习 C++ 的一些新知识,并且我试图从 Visual C++ 测试这个 strncpy_s 函数。但是,由于程序崩溃,我遇到了一些问题,我不知道发生了什么,但我确信这是一个非常愚蠢的问题。源代码是这样的:
#include "stdafx.h"
#include <iostream>
#include <cstdio>
#include <cstring>
int main()
{
char *p;
p=(char *)malloc(sizeof(char)*strlen("Hello!\n"));
strncpy_s(p,strlen("Hello!\n"),"Hello!\n",strlen("Hello!\n"));
std::cout << p;
std::cout << strlen("Hello!\n") << std::endl;
return 0;
}
正如我所说,我没有使用 std::string,因为我想尝试这个新功能并了解它是如何工作的。
最佳答案
我收回我的评论,我阅读了the documentation更仔细。您的代码正在传递无效参数,并正在调用无效参数处理程序。也许这就是正在发生的事情。即:
p=(char *)malloc(sizeof(char)*strlen("Hello!\n"));
这一行为 7 个字符分配了空间,这是字符串的长度,但是没有足够的空间容纳空终止符。 (这一般是错误的)
strncpy_s
的文档说:这些函数试图将 strSource 的前 D 个字符复制到 strDest,其中 D 是 count 和 strSource 的长度中的较小者。 如果这些 D 字符适合在 strDest(其大小以 numberOfElements 给出)并且仍然为空终止符留出空间,那么这些字符将被复制并附加一个终止空值; 否则,strDest[0] 设置为空字符并调用无效参数处理程序,如参数验证中所述。
您是否可能看到“无效参数处理程序”?
关于c++ - 如何使用 visual c++ 中的 strncpy_s 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9316039/