0
char* username[30];
memset(username,0x00,30);
scanf("%s",&username);

これにより、ポインタがメモリ内のランダムな場所を指すようになりますか、それとも安全に使用できますか?

4

6 に答える 6

2

char *username[30]文字ではなく、ポインタの配列です。したがって、コードは非常に間違っています(安全ではないなど)。必要な文字の配列を取得するには:

char username[30];
于 2013-01-09T09:00:09.313 に答える
1

あなたがおそらく望んでいるのは:

int i;
char* username[30];
for(i = 0; i < 30; i++)
{
     username[i] = calloc(100, sizeof(char));  // or whatever size your string is.
     scanf("%s",username[i]);
}
... Code using usernames ...
for(i = 0; i < 30; i++)
{
    free(username[i]);
}

しかし、個人的には、おそらく次のようになります。

int i;
char username[30][100];
for(i = 0; i < 30; i++)
{
     scanf("%s",username[i]);
}

後でポインターを解放する必要がなくなります。

これにより、ユーザー名配列に 30 個の文字列が読み込まれます。

1 つのユーザー名だけを読みたい場合:

char username[30] = {0};    // Same as memset, but shorter to write!
scanf("%s", username);

他の人が示唆しているように、 scanf() は「ユーザーが生成した入力」を読み取るのに最適な関数ではありません-プログラムがすでに「チェック」したデータ(つまり、「面白いもの」が含まれていないデータ)には問題ありません。長さが提供されるなど)、[fscanf() を使用して] ファイルに書き込まれます。ユーザー入力の場合、 を使用fgets()してテキスト行を読み取り、文字列から実際のデータを取得するのに適した方法で処理します。

たとえば、一部のユーザー名が 100 文字を超える場合 [最後の例では 30 文字]、文字列がオーバーフローし、そこから良い結果が得られることはありません [そして、本当に悪いケースでは、かなり後になるまで気付かないでしょう。デバッグが難しくなります - 運が良ければ、すぐにクラッシュします]。

于 2013-01-09T09:17:13.097 に答える
1
char* username[30]; //is array of char pointers.

//Allocate memory for these pointers using calloc(). so no need of memset().  

memset(username,0x00,30);//can be removed.

scanf("%s",&username);//It should be scanf("%s",username[i]);

@perreal、サンプル追加。

#define SIZE 100 //100 chars...
char* username[30]; 
int i;

for(i = 0; i < 30; i++)
{
   username[i] = calloc(SIZE, sizeof(char)); //Add Fail checks if needed.
   scanf("%s",username[i]);
}

上記のコードでは、30 個の文字列を取得できます。30文字の文字列が1つだけ必要な場合

char username[30];
memset(username,0x00,30);
scanf("%s",username);

で十分です。

于 2013-01-09T09:04:25.027 に答える
1

memset(username,0x00,30);  

配列全体ではなく、ポインターの配列の最初の 30 バイトを初期化しています

memset(username,0, sizeof(username));

単純なループは読者にとってより明確ですが、すべてを0に設定します(IMHO)

for (int i = 0; i < 30; username[i++] = NULL) {;}

これをしないでください:

scanf("%s",&username);

scanf は魔法のように何も割り当てません。「ユーザー名」はポインタの配列であり、NULL ポインタです。scanf はどのようにしてメモリの割り当て方法を知る必要がありますか? 代わりにループを実行し、ユーザーに文字列を入力させ、その文字列にメモリを割り当て (+1)、割り当てられたメモリに文字列をコピーして "username[i]" に割り当てます。

于 2013-01-09T09:17:01.530 に答える
1
char* username[30];
memset(username,0x00,30);
scanf("%s",&username);

メモリが割り当てられていないポインターに入力しようとしているため、上記のコードは crash になります。最初にポインタにメモリを割り当ててから、そのメモリ位置に読み込みます。

于 2013-01-09T09:33:44.717 に答える
0
char *username[30]

これは、文字へのポインターの配列です。

をやるchar username[30]

于 2013-01-09T09:49:11.707 に答える