char* username[30];
memset(username,0x00,30);
scanf("%s",&username);
これにより、ポインタがメモリ内のランダムな場所を指すようになりますか、それとも安全に使用できますか?
char* username[30];
memset(username,0x00,30);
scanf("%s",&username);
これにより、ポインタがメモリ内のランダムな場所を指すようになりますか、それとも安全に使用できますか?
char *username[30]
文字ではなく、ポインタの配列です。したがって、コードは非常に間違っています(安全ではないなど)。必要な文字の配列を取得するには:
char username[30];
あなたがおそらく望んでいるのは:
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 文字]、文字列がオーバーフローし、そこから良い結果が得られることはありません [そして、本当に悪いケースでは、かなり後になるまで気付かないでしょう。デバッグが難しくなります - 運が良ければ、すぐにクラッシュします]。
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);
で十分です。
と
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]" に割り当てます。
char* username[30];
memset(username,0x00,30);
scanf("%s",&username);
メモリが割り当てられていないポインターに入力しようとしているため、上記のコードは crash になります。最初にポインタにメモリを割り当ててから、そのメモリ位置に読み込みます。
char *username[30]
これは、文字へのポインターの配列です。
をやるchar username[30]