所以我的任务是:
使用
strncpy
中的strncat
和#include<cstring>
函数, 实现一个功能void concat(const char a[ ], const char b[ ], char result[ ], int result_maxlength)
将字符串
a
和b
连接到缓冲区result
。确定 不要超越结果。它可以容纳result_maxlength
个字符, 不计算\0
终止符。 (也就是说,缓冲区有 可用buffer_maxlength + 1
个字节。)请务必提供'\ 0' 终止子。
我的解决方案(到目前为止)在下面,但我不知道我做错了什么。我实际运行程序时不仅会出现运行时检查失败2错误,而且我不确定应该在哪里添加\0
终结符,或者即使我应该使用strncat
而不是比strncpy
。希望有人能引导我朝着正确的方向前进。是的,这是hw。这就是为什么我说只是引导我朝着正确的方向前进,以便我可以试着弄明白:p
#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)
{
strncat(result, a, result_maxlength);
strncat(result, b, result_maxlength);
}
答案 0 :(得分:2)
至少result
strncat
在concat
的第一个{{1}}之前未初始化。
编辑:是的,正如迈克尔·伯尔所指出的那样,你的结果大小应该随着你从一开始就进步和计算而改变。实际上,这是你选择的误导性名称,因为它是源的最大尺寸,而不是目的地。
答案 1 :(得分:2)
strncat()
的最后一个参数表示缓冲区中可用的剩余空间 - 而不是缓冲区的完整大小。
另请注意,该参数包含终止空字符所需的位置,因此您需要考虑到这一点,因为concat()
的规范是其他的。
最后,根据concat()
规范,缓冲区中的结果不应连接到缓冲区的现有内容(应替换这些内容)。另外,请确保测试您的函数是否正确处理了传入的零长度result_maxlength
参数。
答案 2 :(得分:1)
strncat从b到剩余的结果(无论是较小的,b的长度还是a的result_maxlength长度)
每次返回之前只需将\ 0置于最后位置result[result_maxlength-1] ='\0';
实际上没有指定如果结果太短会怎么做,你是否应该添加尾随0。我想你最好终止那个字符串。
提示:结果的剩余部分为result+strlen(a)