これは本当に簡単な質問です。
char バッファー [250] を持つ構造があります。
struct testStruct{
char buffer[250];
};
たとえば、「テスト文字」をそのバッファに追加するにはどうすればよいですか?
newStruct.buffer = "test characters"; のような単純な割り当ては実際にはできません。
関数sprintf
またはsnprintf
またはstrcpy
またはを使用できます。strncpy
このようなもの:
sprintf(newStruct.buffer,"%s","test characters"); // doesnt protect against buffer overflow
snprintf(newStruct.buffer,250,"%s","test characters"); // guards against overflows
strcpy(newStruct.buffer,"test characters"); // as suggested in another answer also doesnt guard against overflows
strncpy(newStruct.buffer,"test characters",250);// guards against overflows
snprintf
(およびでサイズ 250 を明示的に言及する代わりに、代わりに関数/命令strncpy
を使用できます)sizeof
これにより、「テスト文字」がバッファ配列に配置さ\0
れ、最後に文字が追加されます...
strcat
後で必要に応じて、関数を使用してさらに文字列を追加できます。
man
sprintfのページは次のとおりです。
strcpy(newStruct.buffer, "test characters");
追加するという文字列を追加する場合は、標準 C 関数の strcat または strncat を使用する必要があります。 ただし、バッファ内の最後の実際の文字が終端のゼロである場合に限ります。バッファの最初の文字から開始して文字列をバッファにコピーする場合は、標準 C 関数の strcpy または strncpy を使用する必要があります。たとえば、文字列の長さが 250 未満であることが確実な場合は、次のように簡単に記述できます。
std::strcpy( buffer, "test characters" );
コピーしようとしている文字列のサイズがわからない場合は、strncpy を使用できます。
std::strncpy( buffer, SomeString, 250 );
buffer[249] = '\0';
この場合、コピーが切り捨てられる可能性があります。
バッファにすでに文字列が含まれていて、新しい文字列を追加しようとしている場合、選択は、新しい文字列がバッファに収まるかどうかに基づいて決定されます。
確信が持てれば、あなたは書くことができます
strcat( buffer, "test characters" );
書ける自信がないなら
size_t n = 250 - std::strlen( buffer );
strcat( buffer, SomeString, n );
buffer[249] = '\0';
の配列がある場合はchar
、 を使用できますstrcpy
。この関数は、文字列の末尾まで各文字をコピーします ('\0' もコピーされます)。strncpy
セキュリティ関連にもご利用いただけます。
#include <string.h>
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
引数の順序は、実際には影響と同じであることに注意してくださいdest = src
。
sprintf
より高度なものにも使用できます。に似てprintf
いますが、文字列に書き込みます。
#include <stdio.h>
int sprintf(char *str, const char *format, ...);
ただし、まだ文字列が割り当てられていないstrdup
場合は、ソース文字列がいつ解放される可能性があるかを調べてください。
あなたのケースに戻ると、そのようなものを書くことはできません:newStruct.buffer = "test characters";
のアドレスを別のnewStruct.buffer
場所を指すように変更しようとするからです。これはポインタ ( ) でのみ可能でchar*
、配列では不可能です。
strcpy(newStruct.buffer, "test characters");
また
strncpy(newStruct.buffer, "test characters", sizeof(newStruct.buffer));