2

buf という C 配列があります。その定義は次のとおりです。

char buf[1024];

現在、私の現在のコードはその配列を取得して設定するためにstdin使用fgets()していますが、代わりにコードを使用して設定したいと考えています。現在、buf を設定する行は次のようになっています。

fgets(buf, 1024, stdin);

基本的に、標準入力を「My String」などに置き換えたいと思います。これを行う最善の方法は何ですか?

4

5 に答える 5

9

sprintfたとえば、ここで を探します: Cpp リファレンス

編集:

sprintf(buf, "My string with args %d", (long) my_double_variable);

編集2:

オーバーフローを回避するために提案されているように (ただし、これは標準 C です)、 snprintfを使用できます。

于 2010-08-24T14:55:24.297 に答える
5

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 環境で動作します。

于 2010-08-24T17:06:24.677 に答える
2
strcpy(buf, "My String");

Microsoft のコンパイラには、strcpy の「安全な」バージョンである関数 strcpy_s も含まれています。オーバーランしないようにしますbuf。この特定のケースでは、それはおそらく問題ではありませんが、知っておく必要があります。ただし、他のコンパイラでは使用できないため、移植性が必要な場所では使用できないことに注意してください。

 strcpy_s(buf, sizeof(buf), "My String");
于 2010-08-24T15:01:27.717 に答える
1

多くのバリエーションがあり、いくつかはすでに提案されており、いくつかは提案されていません:

...

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

于 2010-08-24T15:12:19.810 に答える
-1

冗長だが安全:

int copy_size = sizeof( buf ) - 1 < strlen( MyString ) ? sizeof( buf ) - 1 : strlen( MyString );
memset( buf, 0, copy_size + 1 );
memcpy( buf, MyString, copy_size );
于 2010-08-24T15:13:45.610 に答える