0

I know strncpy(s1, s2, n) copies n elements of s2 into s1, but that only fills it from the beginning of s1. For example

s1[10] = "Teacher"
s2[20] = "Assisstant"
strncpy(s1, s2, 2) would yield s1[10] = "As", correct?

Now what if I want s1 to contain "TeacherAs"? How would I do that? Is strncpy the appropriate thing to use in this case?

4

5 に答える 5

2

を使用strcat()して文字列を連結できますが、この場合、ソース文字列のすべてをコピーしたくないため、次のようなものを使用する必要があります。

size_t len = strlen(s1);
strncpy(s1 + len - 1, s2, 2);
s2[len + 2] = '\0';

(終端の nul を追加します。@FatalError に感謝します)。

これはかなり恐ろしいことであり、宛先配列に残っているスペースの量を心配する必要があります。s1が空の場合、コードが壊れることに注意してください!

一部のシステムにはstrncat()( manpage ) があり、これを使用する方がはるかに簡単です。

strncat(s1, s2, 2);
于 2013-02-20T16:40:48.563 に答える
0

必要なものを達成するには、使用する必要があります(ただし、安全strlcatでないと見なされることに注意してください) 。

strlcat(s1, s2, sizeof(s1));

これは、 のサイズに達するまで、文字列s1の一部である に連結されます(これにより、 が回避されます) 。s2s1memory overflow

次にs1、文字列TeacherAs+ NUL 文字に入って終了します

于 2013-02-20T16:48:07.380 に答える
0

結果の文字列に十分なメモリが割り当てられていることを確認する必要があります

s1[10]

「TeacherAs」に収まる十分なスペースがありません。

そこから、あなたは次のようなことをしたいと思うでしょう

//make sure s1 is big enough to hold s1+s2
s1[40]="Teacher";
s2[20]="Assistant";

//how many chars from second string you want to append
int offset = 2;
//allocate a temp buffer 
char subbuff[20];
//copy n chars to buffer
memcpy( subbuff, s2, offset );
//null terminate buff
subbuff[offset+1]='\0';

//do the actual cat
strcat(s1,subbuff);
于 2013-02-20T16:49:25.887 に答える
0

snprintf()次のように使用することをお勧めします。

size_t len = strlen(s1);
snprintf(s1 + len, sizeof(s1) - len, "%.2s", s2);

snprintf()常にヌル終了し、バッファをオーバーランしません。さらに、C99 の標準です。注として、これはs1現在のスコープで宣言された配列であると想定しているため、sizeof機能します。それ以外の場合は、サイズを指定する必要があります。

于 2013-02-20T16:52:24.283 に答える
0

strcatを使用します。

追加する文字列が両方の文字列を保持するのに十分な大きさであることを確認してください。あなたの場合はそうではありません。

上記のリンクから:
char * strcat ( char * destination, const char * source );

文字列の連結 ソース文字列のコピーを宛先文字列に追加します。destination の終端の null 文字は source の最初の文字で上書きされ、destination の両方を連結して形成される新しい文字列の末尾に null 文字が含まれます。

宛先と送信元が重複してはなりません。

于 2013-02-20T16:40:07.343 に答える