c++ - 如何使用 visual c++ 中的 strncpy_s 函数?

标签 c++ string visual-studio visual-c++ visual-studio-express

我正在学习 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/

相关文章:

c++ - 超过 Hackerrank 的时间限制

java - 修复 Java 字符串转换期间的小数位

java - 如何从给定字符串获取描述中的预期输出

visual-studio - 删除挂起的更改,但不要“T 'UNDO' 我从 TFS 进行的更改

c++ - 检查类型是否为枚举的方法

c++ - 合并两个几乎相同的类模板

c++ - 如何用 C 或 C++ 创建单实例应用程序

c - 使用 strlen 查找用户输入 c 的长度

c# - 在应用程序启动时禁用调试器自动中断

c++ - Visual Studio 2010 和 windows SDK 7.0a 编译错误