7

私はCを初めて使用し、文字列に問題があります。Cで指定された文字を含む可変長の文字列を作成するにはどうすればよいですか?これは私が試したものですが、コンパイラエラーが発生します:

int  cLen     = 8    /* Specified Length    */ 
char chr      = 'a'; /* Specified Character */
char outStr[cLen];
int  tmp      = 0;
while (tmp < cLen-1)
  outStr[tmp++] = chr;

outStr[cLen-1] = '\0';

/* outStr = "aaaaaaaa" */
4

4 に答える 4

10

あなたが試すことができます:

char *str = malloc(cLen + 1);
memset(str, 'a', cLen);
str[cLen] = 0;
于 2012-09-10T13:26:02.633 に答える
5

C の文字列は、一見しただけでは、思ったほど柔軟ではないかもしれません。

「char outStr []」で行ったことは、配列構文で反復できるcharへのポインターが必要であることを示すことでした...必要な数について言及したことがないため、文字の実際のストレージは作成されません保管する。

C では、ポインターと呼ばれるこれらの特殊変数から記憶域を切り離すことができます。可変長文字列が必要な例は、実際にそれが必要な理由の良い例です。ストレージがどこにあるかの知識を保持するエンティティが必要です。ストレージ サイズを変更できるメソッドが必要です。

したがって、以下を含めて、動的メモリ割り当てを処理する準備をします。

#include <stdlib.h>

charsへのポインタを宣言する

char *cpString;

「n」文字の割り当てを要求します

cpString=malloc(n*sizeof(char));

これで、 strcat 、 printf、 n-1 文字を持つ文字列でやりたいことは何でもできます (null で終了する必要があるため)。具体的には、文字列を次のように初期化できるようになりました

memset(cpString,X,n-1);
cpString[n]=0;

n-1 文字の XXXX...XXX\0 文字列を作成します。

cpString のストレージ サイズを変更する場合、ここが難しい部分です。新しいストレージ割り当てを要求する前に、割り当てられたメモリを解放する必要があります。

if (cpString !=0)
{
 free(cpString);
 cpString=0;
}
cpString=malloc(n*sizeof(char));

そうしないと、動的メモリ ストレージ領域 (「ヒープ」と呼ばれる) に古い n サイズの再利用できない部分が残ります。

free() を必要としない、より優れたアロケーターがありますが、malloc() free() の使用法を勉強して練習するのはやめたほうがいいでしょう。

于 2012-09-10T13:38:40.240 に答える
2

を使用する必要はありませんstrncat()。文字列は単なる文字配列であるため、文字ごとに直接割り当てを行います。

void repeated_string(char *out, size_t len, char v)
{
  for(; len > 0; --len)
    *out++ = v;
  *out = '\0';
}
于 2012-09-10T13:26:56.823 に答える
1

コードには 2 つの問題があります。

1)長さは(おそらく)あなたが期待しているものではありません。あなたが持っている:

int cLen = 8; /* Specified Length */

おそらく、長さ 8 の文字列が必要です。NULL ターミネータを追加する必要があるため、現在、長さ 7 の文字列しか取得していません。それが必要な場合は、コメントを更新してそれを明確にする必要があります。

int cLen = 9; /* Specified Length (8) + 1 for NULL */

2) char を正しく割り当てていない:

char chr = "a";

正しくありません。文字は一重引用符で指定します。

char chr = 'a';

その後、コードが機能するはずです。

于 2012-09-10T13:45:31.017 に答える