質問

BUFと呼ばれるCアレイがあります。これが定義です:

char buf[1024];

さて、私の現在のコードはからです stdin と用途 fgets() その配列を設定するには、代わりにコードを使用して設定したいと思います。今、BUFを設定する行は次のようになります:

fgets(buf, 1024, stdin);

基本的に、私はstdinを「私の文字列」と言っています。これを行うための最良の方法は何ですか?

役に立ちましたか?

解決

探す sprintf, 、たとえばここ: CPPリファレンス

編集:

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

編集2:

オーバーフローを避けるために提案されているように(ただし、これは標準cです) snprintf.

他のヒント

SNPRINTFはC99のみではなくC99であり、SprintF_S/STRCPY_SはMSVCのみであり、C89ではなくMSVCです。

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 );
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top