0

私はこれが可能であることを知っています

char text[A_BIG_NUMBER];
printf("Enter your name");
scanf("%s",text);

しかし、これを行う方法はありますか?(バックアップとして char 配列を使用せずに)

char* text;
printf("Enter your name");
scanf("%s",text);

最初の方法は簡単ですが、A_BIG_NUMBER がユーザーが入力した文字列を保持するのに十分な大きさでない場合、残りのコードで問題が発生します。一方、大きな数を使用すると、メモリが無駄になります!

ありがとう

追記:タグ間違えてすみません。Cについてのみ質問しています。

4

5 に答える 5

3

あなたは C++ と言っているので、答えは「はい、文字列」です。

std::string name;

std::cout << "Enter your name: ";

if (!std::getline(std::cin, name)) { /* unexpected end of input */ }

// now use "name"

発見したように、通常、外部データを保存するには動的割り当てが必要です。(コードはあまり一般的ではありません。非常に大きな自動配列を持つことはできず、固定サイズは任意のマジック ナンバーと制約を追加します。) C++ は、動的割り当てとクリーンアップの詳細をカプセル化するのに最適な言語です。シンプルな自動変数がすべての作業を行います。

iostream が気に入らない場合は、bool getline(std::FILE *, std::string &)呼び出しをループしstd::fgets+=完全な行を抽出する独自のオーバーロードを作成できます。

于 2012-10-07T13:03:57.697 に答える
1

配列の代わりに動的に割り当てられたメモリを使用することもできますが、オーバーランの根本的な問題は残ります。

char *text = malloc(A_BIG_NUMBER*sizeof(char));
printf("Enter your name");
scanf("%s",text);

scanf次のように、スペースが限られていることを伝える必要があります。

char text[201];
printf("Enter your name");
scanf("%200s",text);

text[201]ターミネータ用に追加の文字スペースがあることに注意してください%200s。入力を 200 の「実際の」文字に制限するcharため、'\0'.

于 2012-10-07T13:02:57.200 に答える
1

char* はユーザー入力文字列を格納するためのメモリを割り当てません。これが 2 番目のコードが機能しない理由です。

メモリの使用量/浪費が心配な場合は、プログラム固有のスタック/ヒープを使用してこれらの制限を克服できます。

于 2012-10-07T13:06:32.003 に答える
0

fgets()ループ内で小さな(っぽい)バッファを使用します。ループ realloc() 内で最終目的地。

/* UNTESTED */
char smallish[1000];
char *destin = NULL;
size_t destin_size = 1;
while (fgets(smallish, sizeof smallish, stdin)) {
    destin_size += strlen(smallish);
    char *tmp = realloc(destin, destin_size);
    if (!tmp) /* deal with error */;
    destin = tmp;
    strcat(destin, smallish);
    if (smallish[strlen(smallish) - 1] == '\n') break;
}
/* use destin */
free(destin);
于 2012-10-07T13:07:10.197 に答える
0

getchar を使用できます。サンプル コードは次のとおりです。

  int size = 128;
  char *s = (char*)malloc (size);
  char c;
  int i;
  while ((c = getchar ()) != '\n' && c != EOF)
    {
      s[i] = c;
      ++i;
      if (i == size)
        {
          size = size * 2;
          char *tmp = realloc (s, size);
          if (tmp != NULL)
            s = tmp;
          else ; // error, try with malloc and copy or exit or whatever you want
        }
    }
  s[i] = 0;
于 2012-10-07T13:20:11.803 に答える