-2
char* s = (char*)malloc(5);

文字列に可変バイト数(数値)を追加するための処理。例*s= 50;

文字列をnullで終了する必要があります。これは機能します。

*(s+1) = 0;

しかし、もっとエレガントな方法はありますか?

コメントに基づくと、これはそれを行う方法のように見えます

char* getvalue(char* str) {
   while((*str++ = getnextchar()) != 'H')
      ;

   *str = '\0'; /* null terminate */

   return str;
}
4

4 に答える 4

2

callocの代わりに使用しmallocます。これにより、メモリがゼロに設定されます。

于 2012-07-14T19:05:54.923 に答える
1

すでに「文字列」として何かを入れていると仮定するとs[0]、次のように単純に終了します。

s[1] = '\0';

ただし、より完全なコード例を投稿すると、文字列を新しいバッファーにコピーするためのより良い方法が一般的に存在する可能性が高くなります。

于 2012-07-14T19:06:22.683 に答える
1

ASCIIを仮定すると、これを行うことができます:

snprintf(s = malloc(5), 5, "%s", "2");

を使用するのは、ソース文字列snprintfがターゲット バッファをオーバーランしないようにするためだけであり、常に.\0s

整数定数を使用する必要がある場合 (または ASCII でない場合):

snprintf(s = malloc(5), 5, "%c", 50);

str提案されたルーチンは、入力がバッファをオーバーランするかどうかを確認しません。API はサイズ パラメータを受け入れる必要があるため、必要以上のバイト数を書き込まないようにチェックできます。文字列の末尾を返したい場合は、関数の別のパラメーターでそれを行うことができます。次に、関数が終了文字が表示されたかどうかを示す指標を返すようにすることができます。

int getvalue (char *str, size_t sz, char **endp) {
   char *end = str;
   while (--sz > 0)
      if ((*end++ = getnextchar()) == 'H') break;
   *end = '\0'; /* null terminate */
   if (endp) *endp = end;
   return end[-1] == 'H';
}
于 2012-07-14T19:11:12.763 に答える
0

ゼロ (0) を埋めることと NULL ('\0') で終了することは、2 つの異なることです。ゼロを埋めるだけの場合は、malloc の後に memset を使用するか、単に calloc を使用します。

文字列を NULL で自動的に終了させたい場合は、strcpy/strncpy を使用してデータを文字列にコピーします。この関数は、データをコピーし、終端の NULL を追加します。

于 2012-07-14T19:13:03.040 に答える