strncat& strncpy帮助c ++

时间:2012-08-31 14:34:48

标签: c++ buffer cstring

所以我的任务是:

  

使用strncpy中的strncat#include<cstring>函数,   实现一个功能

void concat(const char a[ ], const char b[ ], char result[ ],
                 int result_maxlength)
     

将字符串ab连接到缓冲区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);
}

3 个答案:

答案 0 :(得分:2)

至少result strncatconcat的第一个{{1}}之前未初始化。

编辑:是的,正如迈克尔·伯尔所指出的那样,你的结果大小应该随着你从一开始就进步和计算而改变。实际上,这是你选择的误导性名称,因为它是源的最大尺寸,而不是目的地。

答案 1 :(得分:2)

strncat()的最后一个参数表示缓冲区中可用的剩余空间 - 而不是缓冲区的完整大小。

另请注意,该参数包含终止空字符所需的位置,因此您需要考虑到这一点,因为concat()的规范是其他的。

最后,根据concat()规范,缓冲区中的结果不应连接到缓冲区的现有内容(应替换这些内容)。另外,请确保测试您的函数是否正确处理了传入的零长度result_maxlength参数。

答案 2 :(得分:1)

  1. strncpy从a到结果(无论是更小的,还是a或result_maxlength的长度)
  2. strncat从b到剩余的结果(无论是较小的,b的长度还是a的result_maxlength长度)

  3. 每次返回之前只需将\ 0置于最后位置result[result_maxlength-1] ='\0';

  4. 实际上没有指定如果结果太短会怎么做,你是否应该添加尾随0。我想你最好终止那个字符串。

    提示:结果的剩余部分为result+strlen(a)