strncpy と sizeof を使用して最大文字数をコピーする

strncpy しません 文字列を切り捨てる場合は、宛先を null で終了します。 strncpy を使用する必要がある場合 、次のように結果が終了していることを確認する必要があります:

strncpy(call, info.called, sizeof(call) - 1);
call[sizeof(call) - 1] = '\0';

BSD の strlcpy() 、とりわけ、一般的に優れていると見なされます:

http://www.openbsd.org/cgi-bin/man.cgi?query=strlcpy


ソースの長さが未満の場合 3 番目のパラメーター strncpy として渡される最大数は、宛先を null で終了します。それ以外の場合は、そうではありません。

ソースの長さがデスティネーションと同じかそれ以上の場合、それを処理するのはあなたの問題です。あなたが提案したように - strlen() を呼び出す - バッファがヌルで終了せず、未定義の動作に遭遇するため、機能しません.

より大きなバッファを割り当てることができます:

char buffer[bufferSize + 1];
strncpy( buffer, source, bufferSize );
*(buffer + bufferSize ) = 0;

あなたのアイデア:

call[strlen(call) - 1] = '\0';

strlen() を呼び出しているため、機能しません。 終了していない文字列