在我的项目中,我遇到了strncpy
这些奇怪的问题。我检查了reference。但是函数strncpy
的行为让我感到困惑。
在function中,当它运行到strncpy(subs,target,term_len);
虽然我不知道为什么字符串后面有两个空格?!!!这是一个很大的项目,我不能在这里粘贴所有代码。以下只是一块。我的所有代码都是here。
char* subs = new char[len];
while(top<=bottom){
char* term = m_strTermTable[bottom].strterm;
int term_len = strlen(term);
memset(subs,'\0',len);
strncpy(subs,target,term_len);
int subs_len = strlen(subs);
int re = strcmp(subs,term);
if (re == 0)
{
return term_len;
}
bottom--;
}
delete[] subs;
答案 0 :(得分:2)
strlen(target) > term_len
成立,则 strncpy
不会添加终止空字节。如果发生这种情况,subs
可能会或可能不会被正确终止。
尝试将strncpy
来电更改为
strncpy(subs, target, term_len-1);
因此,即使strncpy
未添加终止空字节,subs
仍会因之前的memset
调用而无法正确终止。
现在,正如所说的那样 - 你可以完全避免使用单独的subs
缓冲区(如果控制流进入return
语句,则无论如何泄漏)只需使用strncmp
在
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--;
}