各文字列を 1 つの行に、次の文字列を別の行に (つまり、Enter キーを押して行を変更する) 2 次元配列で入力を取得したい場合。Cでそれを行うにはどうすればよいですか。Cには便利な「文字列」処理がないようです。明らかに、getchar() を使用せずにそうするという意味です。
3 に答える
以下の3つの方法があります。
文字列の最大数と文字の最大数がわかっている場合は、以下の方法を使用して 2D 文字配列を宣言できます。
char strs[MAX_NO_OF_STRS][MAX_NO_CHARS] = {0};
for (i = 0; i < MAX_NO_OF_STRS; i++)
{
scanf("%s", strs[i]);
}
文字列の最大数が分かっていて、すべての文字列にメモリを割り当ててメモリを無駄にしたくない場合MAX_NO_CHARS
。次に、char ポインタの配列を探します。
char temp[MAX_NO_CHARS] = {0};
char *strs[MAX_NO_OF_STRS] = NULL;
for (i = 0; i < MAX_NO_OF_STRS; i++)
{
scanf("%s", temp);
strs[i] = strdup(temp);
}
実行時の文字列の最大数がわかっている場合は、 の double ポインターを宣言できますchar
。ユーザーから文字列の数を取得し、n
メモリを動的に割り当てます。
char temp[MAX_NO_CHARS] = {0};
char **strs = NULL;
int n = 0;
scanf("%d", &n);
strs = malloc(sizeof(char*) * n);
for (i = 0; i < n; i++)
{
scanf("%s", temp);
strs[i] = strdup(temp);
}
#include<stdio.h>
main()
{
char student_name[5][25];
int i;
for(i=0;i<5;i++)
{
printf("\nEnter a string %d: ",i+1);
scanf(" %[^\n]",student_name[i]);
}
}
scanf(" %[^\n]") にスペースを入れることにより、getchar() を使用せずに 2 次元配列を使用して文字列を読み取ることができます。%[^\n]! の前に
malloc
ポインターの配列を使用して固定サイズのバッファーでいっぱいにする代わりに、2 次元配列を (静的ストレージまたはスタック上で) 割り当てていっぱいにすることもできます。KingsIndian の変更されたコード例は、次のようになります。
#include <stdio.h>
int main()
{
char str[2][256] = {{0}};
int i = 0;
for(i=0;i<2;i++)
{
scanf("%255s", &str[i][0]);
}
return 0;
}
取得する予定のすべての文字列が一定のサイズよりも長くない場合、このアプローチにより、自分でメモリを解放する必要がなくなります。ただし、柔軟性が低く、個々のバッファーのサイズをそれに含まれる文字列に合わせることができません。
編集
コメント内の情報に追加して、空白ではなく改行のみで終了する文字列を読み取ります。
scanf("%255[^\n]", str[i]);