1

私は C に取り組んでおり、文字列連結関数を実装したいと考えています。次の機能を実装しました。

void mystr_concat(char* dest, char* src)
{
        char* temp = dest;
        while(*temp)
        {
                temp++;
        }

        while(*src)
        {
                *temp++ = *src;
                src++;
        }
        *temp = '\0';
        return;
}

上記のプログラムの出力は、「src」文字列を「dest」文字列に追加することです。

ユーザーが長さが短い「dest」文字列を渡した場合、「src」文字列を追加できなくなります。

たとえば、ユーザーはこの文字列と呼び出された関数を持っています

char dest[6] = "abcnd";
char src[100] = "zdfhjksdfskdfsdfsdfj";
mystr_concat(dest, src)

この場合、上記の発生条件と、この問題を解決するために必要な解決策を確認するにはどうすればよいですか?

4

2 に答える 2

2

C は、配列参照に対して境界チェックを実行しません。これを行う必要がある場合は、宛先配列の最大サイズを関数に渡してから、ソースが収まることを確認する (または必要に応じて切り捨てることを決定する) か、追加のデータ構造を導入してデータを追跡する必要があります。典型的な Pascal 実装が各文字列にその最大長をプレフィックスとして付ける方法で、文字列の長さを指定します。

どちらのソリューションも自動ではなく、安全な方法でこの機能をサポートするには、Java や C# などの言語を使用して、安全でない構造の使用を防ぐ必要があります。

于 2013-10-17T06:49:03.773 に答える