buf という C 配列があります。その定義は次のとおりです。
char buf[1024];
現在、私の現在のコードはその配列を取得して設定するためにstdin
使用fgets()
していますが、代わりにコードを使用して設定したいと考えています。現在、buf を設定する行は次のようになっています。
fgets(buf, 1024, stdin);
基本的に、標準入力を「My String」などに置き換えたいと思います。これを行う最善の方法は何ですか?
sprintf
たとえば、ここで を探します: Cpp リファレンス
編集:
sprintf(buf, "My string with args %d", (long) my_double_variable);
編集2:
オーバーフローを回避するために提案されているように (ただし、これは標準 C です)、 snprintfを使用できます。
snprintf は C89 ではなく C99 のみであり、sprintf_s/strcpy_s は MSVC のみであり、C89 ではなく、C99 ではありません。
char *mystr="come from stdin or file or ...";
char buf[1024];
...
memset(buf,0,sizeof buf);
strncpy(buf,mystr,(sizeof buf)-1);
または非配列:
#define BUFLEN 512
char *mystr="come from stdin or file or ...";
char *buf;
...
char *buf=calloc(1,BUFLEN);
strncpy(buf,mystr,BUFLEN-1);
すべての ANSI C 環境で動作します。
strcpy(buf, "My String");
Microsoft のコンパイラには、strcpy の「安全な」バージョンである関数 strcpy_s も含まれています。オーバーランしないようにしますbuf
。この特定のケースでは、それはおそらく問題ではありませんが、知っておく必要があります。ただし、他のコンパイラでは使用できないため、移植性が必要な場所では使用できないことに注意してください。
strcpy_s(buf, sizeof(buf), "My String");
多くのバリエーションがあり、いくつかはすでに提案されており、いくつかは提案されていません:
...
char input[] = "My String";
strcpy(buf, input);
strncpy(buf, input, sizeof(buf));
sscanf(input, "%s", buf);
sprintf(buf, "%s", input);
memcpy(buf, input, strlen(input));
...
それらのほとんどは不明/不安です。正確に何をすべきかは、コードで本当に何をしたいかによって異なります。
よろしく
rbo
冗長だが安全:
int copy_size = sizeof( buf ) - 1 < strlen( MyString ) ? sizeof( buf ) - 1 : strlen( MyString );
memset( buf, 0, copy_size + 1 );
memcpy( buf, MyString, copy_size );