【问题标题】:"strncpy_s" Not Working“strncpy_s”不工作
【发布时间】:2015-02-17 13:54:16
【问题描述】:

我正在尝试使用 strncpy_s 将字符从一个单词转换为数组(我无法在 Visual Studio 2013 中使用 strncpy,而且我对 strncpy_s 完全陌生)。无论我做什么,我都会不断收到这些错误:

错误 1 ​​错误 C2660: 'strncpy_s' : 函数不接受 3 个参数

错误 2 IntelliSense:没有重载函数“strncpy_s”的实例 匹配参数列表的参数类型有:(char *, char, int)

我的代码的目的是:

如果用户输入,例如“HELLO”(即 text = HELLO) 然后->

Copy HELLO to first_array [0]
Copy  ELLO to first_array [1]
Copy   LLO to first_array [2]
Copy    LO to first_array [3]
Copy     O to first_array [4]

这是我的代码:

int _tmain(int argc, _TCHAR* argv[])
{
    char text[32];
    cin >> text;
    char* first_array[] = {""};
    int n = strlen(text);

    for (int i = 0; i < n; i++)
    {
        strncpy_s(first_array[i], text[i], n-i);
    }
}

编辑 1。再修改一下代码,现在程序可以运行了,但是输入一个文本后,它突然给我“example.exe停止工作”的错误。

int _tmain(int argc, _TCHAR* argv[])
{
    char* text[32];
    cin >> *text;
    char* first_array[] = {""};
    //int n = strlen(text);
    int n = sizeof(text);

    for (int i = 0; i < n; i++)
    {
        strncpy_s(first_array[i], n - i, text[i], 32);
    }

【问题讨论】:

  • 'strncpy_s' : function does not take 3 arguments... 你的答案就在那里。您传递的参数are: (char *, char, int)。这是三个论点,这是错误的。查看 remyabel 的链接,这实际上是您在搜索引擎中输入“strncpy_s”时的热门链接。
  • 如果这确实是 C++(因为它最初被标记),那么为什么不使用 std::string 和朋友呢?
  • 缺少#include。 @DevSolar 公平地说,Microsoft 还记录了仅 C++ 的 3 参数版本。
  • 为什么不能使用strncpy?并不是说它会比strncpy_s 更好,只是一种不同的坏。无论如何,first_arraychar* 的一元数组,所以无论哪种方式,情况都同样糟糕。另外,avoid TCHAR.

标签: c++ strncpy


【解决方案1】:

您的代码有几个问题。

首先,您对strncpy_s 的调用不遵循declaration of strncpy_s,它列出了四个 参数(如果第一个参数是char *,如您的情况):

errno_t strncpy_s(
   char *strDest,
   size_t numberOfElements,
   const char *strSource,
   size_t count
);

但更重要的是,您声明您希望在数组first_array[] 中得到多个字符串,每个字符串都包含比上一个更短的输入字符串版本。 但是您声明的 first_array[] 只包含 一个 char * 字符串,您将 first_array[0] 初始化为的那个,正好是一个字符长(终止空字节)

char* first_array[] = {""};

即使你声明它持有 5 个 char * (初始化不是必需的,因为你无论如何都要复制内容)...

char * first_array[5];

...您还没有为五个char * 字符串中的每一个分配内存空间。您只有五个指向任何地方的指针,并且必须动态分配内存,取决于用户输入

因为我什至没有讨论过如果用户输入超过 5 个字符会发生什么,更不用说 32...

在这一点上,即使我发布“工作”代码,它也不会教给你什么。您显然是在学习某种教程,或者实际上是在尝试通过反复试验来学习。我认为这里的正确答案是:

获取不同的教程。更好的是,获得good book on Cgood book on C++,因为众所周知缺乏在线教程。

【讨论】:

  • 非常感谢 DevSolar。类型的问题正是让我怀疑的原因。你指出来真是太好了。但是,我仍然不知道 first_array 和 text 使用哪种类型。我已经尝试过很少有人回答..你能指导我一下吗?并感谢大量有用的链接。绝对是黄金。
  • @gejak:你的问题是一个更普遍的问题。您的代码在多个地方表现出未定义的行为(C/C++ 对此非常无情),因为您显然没有掌握整个指针/数组/内存分配的内容。在这一点上,告诉你如何解决这个问题只会让你以后失败,这就是我链接书籍列表的原因。退后一步,不要试图让你的这个程序工作,而是正确地学习你正在使用的语言。其他语言在试验和错误中相对“安全”。C/C++ 不是。你需要知道
  • @gejak:如果你真的要使用 C++,你会使用std::string,而不是使用char *strncpy*()但是您仍然需要知道指针、数组和内存处理是如何工作的 否则您将在其他一些稍后的问题上惨败。解释语言基础绝对超出了 StackOverflow 问答的范围。
  • 我一定会研究这些材料。我还是个初学者,还有很多东西要学我最好自己做这一切。但是对于这个;我已经为此工作了至少 10 个小时,但仍未能找到问题所在。我查看了很多不同的文章。我真的不知道我应该如何使用 std::string 来满足我对 first_array 和 text 的要求。我应该对每个字符串使用多少不同?
  • @gejak:再说一遍......不要试图通过查看源代码来学习 C 或 C++。这些语言最好从书籍中学习,这是有充分理由的。您必须了解其他人编写的代码背后 的概念,否则您将保持盲目,或者充其量只能是一只眼睛。即使是在线教程也是一个糟糕的学习资源,因为它们通常是由人们在学习过程中编写的。你没有经验自己发现不好的建议、坏习惯和破例。 买一本书,从头开始学习。如果这段代码确实花费了你 10 个小时的时间,你知道为什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
  • 2019-01-19
相关资源
最近更新 更多