2

だから私の割り当ては:

strncpyのandstrncat関数を使用して、関数を#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。うまくいけば、誰かが私を正しい方向に導くことができます。そして、はい、これはハードウェアです。だから私はそれを理解しようと試みることができるように私を正しい方向に導くと言ったのです: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);
}
4

3 に答える 3

2

少なくとも、resultの最初の前に初期化さstrncatれていませんconcat

編集: はい、Michael Burr が指摘しているように、結果のサイズは、進行するにつれて変化し、最初から計算されるはずです。実際には、宛先ではなくソースの最大サイズであるため、選択した誤解を招く名前です。

于 2012-08-31T14:38:04.930 に答える
2

の最後の引数は、バッファのフル サイズではなく、バッファ内で使用可能な残りのstrncat()スペースを表します。

また、その引数には、終端のヌル文字が必要とする場所が含まれていることに注意してください。仕様がそうでないため、それを考慮する必要がありconcat()ます。

最後に、concat()仕様によると、バッファーに配置された結果は、バッファーの既存の内容に連結されるべきではありません (これらの内容は置き換えられる必要があります)。result_maxlengthまた、渡された長さゼロの引数を関数が適切に処理することをテストしてください。

于 2012-08-31T14:38:38.350 に答える
1
  1. a から結果への strncpy (a の長さまたは result_maxlength のいずれか小さい方)
  2. b から残りの結果までの strncat (b の長さまたは result_maxlength - a の長さのいずれか小さい方)

  3. すべてのリターンの前に、最後の位置に \0 を置くだけですresult[result_maxlength-1] ='\0';

結果が短すぎる場合に何をするか、末尾の 0 を追加するかどうかは実際には指定されていません。その文字列を終了した方がよいと思います。

ヒント:残りの結果はresult+strlen(a)

于 2012-08-31T14:47:27.417 に答える