2012-09-01 39 views
0

当我编译并运行我的程序时,似乎一切正常,除了出现“运行时检查失败#2”错误,手头的任务都正常。这是我的主要任务,这是我第一次尝试使用任何cstring函数,所以我确信这是我出错的地方。基本上,我将两个字符串附加在一起,我几乎100%确定它与我的结果参数超出范围有关。只是不知道如何解决它。strncpy运行时检查失败#2错误C++

#include <iostream> 
#include <cstring> 
using namespace std; 

void concat(const char a[ ], const char b[ ], char result[ ], int result_maxlength); 
int main() 
{ 
    char a[] = "Woozle"; 
    char b[] = "Heffalump"; 
    char c[5]; 
    char d[10]; 
    char e[20]; 
    concat(a, b, c, 5); 
    concat(a, b, d, 10); 
    concat(a, b, e, 20); 
    cout << c << "\n"; 
    cout << d << "\n"; 
    cout << e << "\n"; 
    return 0; 
} 
void concat(const char a[ ], const char b[ ], char result[ ], int result_maxlength) 
{ 
strncpy (result,a, result_maxlength); 
strncat (result, b, result_maxlength); 
result[result_maxlength-1] = '\0'; 
} 
+1

这和你以前的问题有何不同? http://stackoverflow.com/questions/12217528/strncat-strncpy-help-c?rq=1 –

回答

1

到目前为止,您有几个与此代码有关的问题。一个很少有人谈论的非常微妙的是:根据POSIX规范,如果移动的非空字符数达到指定的限制('n'),则strncpy的行为不会在您的字符串上设置空终止符。 )。但是,它会填充空值以达到'n'。因此:

char ar[3]; 
strncpy(ar, "food", sizeof(ar)/sizeof(ar[0])); 

这将最终有一个(0)= 'F',A(1)= 'o' 及AR(2)= 'O'。 将不会添加空终止符。忽略最后一个字符正是由于这个原因,人们对于调用这个运行时库函数非常头痛。考虑到这一点很重要。因此你会经常看到这样的代码。

char ar[3]; 
strncpy(ar, "food", sizeof(ar)/sizeof(ar[0])-1); 
ar[sizeof(ar)/sizeof(ar[0])-1] = 0; 

这可能会得到你真正想要的,即ar =“fo”。充足的空间情况反转了这一点。如果你有一个有足够空间的缓冲区,'n'将用空值填充直到'n'到达'n',如果副本的源字符串在到达'n'之前到达它自己的终止符。因此:

char ar[30]; 
strncpy(ar, "food", sizeof(ar)/sizeof(ar[0])-1); 
ar[sizeof(ar)/sizeof(ar[0])-1] = 0; 

将导致ar =“食物”,在'd'之后有二十六个零字符。保持他们的脚趾人,不那么明显的memset到零调用:

char ar[30]; 
strncpy(ar, "", sizeof(ar)/sizeof(ar[0])); 

没错,它就是错了,我知道了。

所有这些被说成是毫不奇怪的,显然strncat()的行为不同于你的代码似乎反映出你目前可能相信的。例如,最后一个参数不指定要在目标中限制的字符数。相反,它描述了限制从源复制的字符数量。换句话说,当你继续使用新的琴弦时,尾部空间限制器应该不断缩短。当然,要知道有多少涉及跟踪每一步的复制字符,正如有人指出的那样,这使得strncat在许多情况下无用,提供了比实用程序更多的困惑。

仅供参考,具有定义行为的准确定义可在此处看到strncpystrncat。在继续完成作业之前,我会强烈建议您清楚地阅读两者。

+0

非常感谢你!我需要这个清楚的解释。我仍然是编程新手,但这意味着很多。 –

+0

完全没有问题。乐意效劳。 – WhozCraig

1

strncat没什么用,因为num参数不是目的地的总规模,它是要复制的字节数。

相关问题