Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用visual c+中的strncpy_函数+;? 我在C++中学习了一些新东西,我试着用VisualC++来测试这个StncPype函数。然而,由于程序崩溃,我遇到了一些问题,我不知道发生了什么,但我确信这是一个相当愚蠢的问题。源代码如下所示: #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; } #包括“stdafx.h” #包括 #包括 #包括 int main() { char*p; p=(char*)malloc(sizeof(char)*strlen(“Hello!\n”)); strncpy_s(p,strlen(“Hello!\n”),“Hello!\n”,strlen(“Hello!\n”)); STD::代码> >代码> >(s)只告诉您没有NUL终结符的字符串长度。为了分配一个字符串来复制字符串,通常使用 StrLN(S)+ 1 < /C> >,为NUL终止符添加空间。< /P> < p>为什么使用Maloc或Car *,如果使用C++?< /p> std::string p = "Hello!\n"; std::cout << p; std::cout << p.length(); std::string p=“Hello!\n”; std::cout_C++_String_Visual Studio_Visual C++_Visual Studio Express - Fatal编程技术网 >代码> >(s)只告诉您没有NUL终结符的字符串长度。为了分配一个字符串来复制字符串,通常使用 StrLN(S)+ 1 < /C> >,为NUL终止符添加空间。< /P> < p>为什么使用Maloc或Car *,如果使用C++?< /p> std::string p = "Hello!\n"; std::cout << p; std::cout << p.length(); std::string p=“Hello!\n”; std::cout,c++,string,visual-studio,visual-c++,visual-studio-express,C++,String,Visual Studio,Visual C++,Visual Studio Express" /> >代码> >(s)只告诉您没有NUL终结符的字符串长度。为了分配一个字符串来复制字符串,通常使用 StrLN(S)+ 1 < /C> >,为NUL终止符添加空间。< /P> < p>为什么使用Maloc或Car *,如果使用C++?< /p> std::string p = "Hello!\n"; std::cout << p; std::cout << p.length(); std::string p=“Hello!\n”; std::cout,c++,string,visual-studio,visual-c++,visual-studio-express,C++,String,Visual Studio,Visual C++,Visual Studio Express" />

如何使用visual c+中的strncpy_函数+;? 我在C++中学习了一些新东西,我试着用VisualC++来测试这个StncPype函数。然而,由于程序崩溃,我遇到了一些问题,我不知道发生了什么,但我确信这是一个相当愚蠢的问题。源代码如下所示: #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; } #包括“stdafx.h” #包括 #包括 #包括 int main() { char*p; p=(char*)malloc(sizeof(char)*strlen(“Hello!\n”)); strncpy_s(p,strlen(“Hello!\n”),“Hello!\n”,strlen(“Hello!\n”)); STD::代码> >代码> >(s)只告诉您没有NUL终结符的字符串长度。为了分配一个字符串来复制字符串,通常使用 StrLN(S)+ 1 < /C> >,为NUL终止符添加空间。< /P> < p>为什么使用Maloc或Car *,如果使用C++?< /p> std::string p = "Hello!\n"; std::cout << p; std::cout << p.length(); std::string p=“Hello!\n”; std::cout

如何使用visual c+中的strncpy_函数+;? 我在C++中学习了一些新东西,我试着用VisualC++来测试这个StncPype函数。然而,由于程序崩溃,我遇到了一些问题,我不知道发生了什么,但我确信这是一个相当愚蠢的问题。源代码如下所示: #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; } #包括“stdafx.h” #包括 #包括 #包括 int main() { char*p; p=(char*)malloc(sizeof(char)*strlen(“Hello!\n”)); strncpy_s(p,strlen(“Hello!\n”),“Hello!\n”,strlen(“Hello!\n”)); STD::代码> >代码> >(s)只告诉您没有NUL终结符的字符串长度。为了分配一个字符串来复制字符串,通常使用 StrLN(S)+ 1 < /C> >,为NUL终止符添加空间。< /P> < p>为什么使用Maloc或Car *,如果使用C++?< /p> std::string p = "Hello!\n"; std::cout << p; std::cout << p.length(); std::string p=“Hello!\n”; std::cout,c++,string,visual-studio,visual-c++,visual-studio-express,C++,String,Visual Studio,Visual C++,Visual Studio Express,您需要分配strlen(“Hello!\n”)+1(对于空终止符)。而sizeof(char)是毫无意义的,因为sizeof(char)在所有平台上都保证为1。您还需要1个字符来终止字符('\0'),所以您需要用strlen(“Hello!\n”)替换strlen(“Hello!\n”)+ 1 < /代码>。您可以将此长度存储在某个变量中,而不是再次调用“代码> StLLN < /Cult>。也因为您使用C++,您可以使用 NeX/Dele< 代替 MalC/Cube : int len = s

您需要分配strlen(“Hello!\n”)+1(对于空终止符)。而sizeof(char)是毫无意义的,因为sizeof(char)在所有平台上都保证为1。

您还需要1个字符来终止字符(
'\0'
),所以您需要用
strlen(“Hello!\n”)
替换strlen(“Hello!\n”)+ 1 < /代码>。您可以将此长度存储在某个变量中,而不是再次调用“代码> StLLN < /Cult>。也因为您使用C++,您可以使用<代码> NeX/Dele< <代码>代替<代码> MalC/Cube <代码>:

int len = strlen("Hello!\n") + 1;
char *p;
p = new char[len];
strncpy_s(p, len, "Hello!\n", len);
std::cout << p << len << std::endl;
delete[] p;
int len=strlen(“Hello!\n”)+1;
char*p;
p=新字符[len];
strncpy_s(p,len,“Hello!\n”,len);

std::cout我收回我的评论,我读得更仔细了。您的代码正在传递无效的参数,并且正在调用无效的参数处理程序。可能就是这样。即:

p=(char *)malloc(sizeof(char)*strlen("Hello!\n"));
此行为7个字符分配空间,这是字符串的长度,但没有足够的空间容纳空终止符。(这通常是一个错误)

strncpy_s
的文档说明:这些函数尝试将strSource的前D个字符复制到strDest,其中D是count和strSource的长度中的较小者。如果这些D个字符适合strDest(其大小以numberOfElements给出)并仍为空终止符留出空间,然后复制这些字符并追加终止的空字符;否则,将strDest[0]设置为空字符并调用无效的参数处理程序,如参数验证中所述


您可能看到了“无效参数处理程序”吗?

安全增强型字符串函数本质上是为了在遇到问题时崩溃而设计的

发件人:

这些函数尝试将strSource的前D个字符复制到 strDest,其中D是count和strSource的长度中的较小者。 如果这些D字符适合strDest(其大小如下所示 numberOfElements)并仍然为空终止符留出空间 复制这些字符并附加终止null; 否则,strDest[0]被设置为空字符,并且无效 调用参数处理程序,如参数验证中所述

上述段落有一个例外。如果count为_TRUNCATE, 然后,将尽可能多的strSource复制到strDest中 仍然为始终附加的终止null留出空间

最重要的是:

当发现无效参数时,C运行时的行为是 调用当前分配的无效参数处理程序。默认值为 无效参数调用Watson崩溃报告,这会导致 应用程序崩溃,并询问用户是否要加载崩溃 转储到Microsoft进行分析。在调试模式下,参数无效 也会导致断言失败

使用函数可以更改此行为 _set_invalid_parameter_handler可将无效参数处理程序设置为您自己的函数

您的示例程序提供的缓冲区太小,小于一个字符(没有空终止符的空间)


因此,除非您特别更改遇到错误时strxxxx函数应执行的操作,否则您的程序将因设计而崩溃。其思想是崩溃优于可能打开安全漏洞的错误。

使用调试器查看崩溃发生的位置。Stackoverflow不是调试器。我这样做了。问题出在哪里在strncpy_的函数调用中。我将复制我在问题主题中写的文本:“正如我说的,我不使用std::string,因为我想尝试这个新函数并了解它是如何工作的。”是的。但是,STD的问题是什么:CUT,在C++中,没有理由使用<代码> StncPy < /C>或几乎任何其他函数在代码> CSTON/COD>头。我必须非常愚蠢,我不能意识到,简单的东西。你不小心做了:
strlen(s+1)
,它仍然可以编译,但是给出了一个错误的答案(用2代替1太小了),但是错误更容易被忽略。我喜欢sizeof操作符,这就是为什么我使用sizeof(char)没有任何目的的代码是不酷的。它只是增加了复杂性。可能会有人想出一个机器,其中sieOf(char)=4;;不是在C++中,他们不能,@ VICTRO.C++定义<代码> char < /Code >大小为1。实际上,<代码> sieSoof
返回字符数。Dude,当我说的时候我在开玩笑。“有人会发明一台机器,它的大小(char)=4?;)”。这个表情符号的意思是“开玩笑”。如果你真的对这个大小(char)感到恼火的话然后我再也不会为了看到你高兴而这样做了;)正如我在主题中所说的,我正在尝试学习这个新函数,这就是为什么我没有使用std::string。@维克托:很抱歉,我在代码块后错过了那个注释。是的,那里应该有+1。你也可以使用
sizeof“Hello!\n”
p=(char *)malloc(sizeof(char)*strlen("Hello!\n"));