C++ 函数strncpy的奇怪行为?

C++ 函数strncpy的奇怪行为?,c++,visual-c++,visual-studio-debugging,C++,Visual C++,Visual Studio Debugging,在我的项目中,strncpy遇到了这些奇怪的问题。我已经查过了。但是函数strncpy行为让我感到困惑。 在这种情况下,当它运行到strncpy时(subs、target、term_len) 但我不知道为什么绳子后面有两个空格?!!!这是一个大项目,我不能把所有的代码都粘贴在这里。以下只是一个片段。我所有的代码都是 char*subs=新字符[len]; 而如果源字符串长度超过最大字符数(即,在您的情况下,如果strlen(target)>term\u len保持不变),则(top不会添加终止

在我的项目中,
strncpy
遇到了这些奇怪的问题。我已经查过了。但是函数
strncpy
行为让我感到困惑。 在这种情况下,当它运行到strncpy时(subs、target、term_len)

但我不知道为什么绳子后面有两个空格?!!!这是一个大项目,我不能把所有的代码都粘贴在这里。以下只是一个片段。我所有的代码都是

char*subs=新字符[len];
而如果源字符串长度超过最大字符数(即,在您的情况下,如果
strlen(target)>term\u len
保持不变),则(top不会添加终止空字节)。如果发生这种情况,
subs
可能会正确终止空字节,也可能不会正确终止空字节

尝试将您的
strncpy
呼叫更改为

strncpy(subs, target, term_len-1);
因此,即使
strncpy
没有添加终止的空字节,
subs
仍将由于前面的
memset
调用而正确地以空终止

现在,也就是说,您可以完全避免使用单独的
subs
缓冲区(在控制流到达
return
语句的情况下,它会泄漏),只需使用


(如果这是C++,为什么你不只是使用<代码> STD::String < /Calp> s?StrncPy并不总是添加一个空终止符。它是一个特别愚蠢的函数,我将避免使用。你检查过代码< TyMyLLN < /代码>值吗?可能是<代码> TyMyLeN<代码>大于<代码> Le<代码>?而不是<代码> char *子s=新char [LeN]
您可以使用
std::vector subs(len)
以避免在到达
返回时发生内存泄漏。我在SO上看到的
strncpy
的每次使用都是毫无意义的。使用通常只是用数据损坏替换缓冲区溢出,就像这一次一样。很少有情况下
strncpy
是合适的;没有充分的理由不进行验证我鼓励程序员使用它。
strncpy(subs, target, term_len-1);
while(top<=bottom) {
    char* term = m_strTermTable[bottom].strterm;
    int term_len = strlen(term);
    if (strncmp(term, target, term_len) == 0) {
        return term_len;
    }
    bottom--;
}