我正在使用多维数组创建一个包含表格的C程序,用于存储两个字母和一个数字,如下所示:
int main()
{
char x[5][3];
int y[5];
for (i=0; i<5; i++)
{
printf('Enter the 2 characters for x');
scanf('%s', x[i]);
printf('Enter number for y');
scanf('%d', &y[i]);
}
}
我在这里不明白的是for
循环。例如,对于迭代i=0
,如果用户输入两个字符A
,B
这些字母存储在x
的内存位置?我的意思是它位于x[0][0]
或x[0][1]
或其他位置?
我知道这可能是一个愚蠢的问题,但我真的很困惑。 感谢您的帮助。
答案 0 :(得分:4)
C中的多维数组是一维数组元素又是数组。
例如,如果您有一个定义为
的数组char x[5][3];
您可以通过以下方式重写其定义
typedef char T[3];
T x[5];
所以现在数组x
看起来像一个类型T
的一维数组,其中T
又有类型char[3]
考虑到这一点,在程序循环中使用数组x
和数组y
之间没有区别。
for ( i = 0; i < 5; i++ )
{
printf('Enter the 2 characters for x');
scanf('%s', x[i]);
printf('Enter number for y');
scanf('%d', &y[i]);
}
两个数组都有5
个元素。数组x
的元素具有类型char[3]
和数组y
的元素的唯一区别是类型int
。
因为格式说明符%s
用于在字符数组中输入字符串,并且数组x
的每个元素确实是类型char[3]
的字符数组,所以每次循环迭代时每个数组x[i]
都有自己的字符串。
例如,在向数组输入值之后,它可能看起来像是按照以下方式定义的
char x[5][3] =
{
{ "AB" }, /* x[0] */
{ "CD" }, /* x[1] */
{ "EF" }, /* x[2] */
{ "GH" }, /* x[3] */
{ "IJ" } /* x[4] */
};
答案 1 :(得分:1)
是的,它将存储在x [0] [0]和x [0] [1]位置。
虽然scanf
字符串,但我们需要在代码中提供character Array's
内存位置的起始地址为x[i]
答案 2 :(得分:1)
在您的示例中,它们将分别存储在x[0][0]
和x[1][0]
。
此外,您可能希望将scanf('%s', x[i]);
更改为scanf('%c', x[i]);
,因为您只使用了一个字符。
答案 3 :(得分:0)
这是一个指针所以,如果用户输入字符串“AB”,将在内存中分配“AB”,你的数组的第一个案例将指向分配给它的第一个案例string:
... | 45 | 46 | 47 | 48 | ...
---------------------
| x | A | B | x |
例如,x [0] [0]将指向案例46。
答案 4 :(得分:-1)
问题在于,你有一个二维char数组,这意味着在一个内存位置你不能存储多个单个字符。因此它将存储在0和1位置。但是我认为你的方法不正确。
在您的情况下,您要么存储char *,以便您的数组类似于:
char* tab[5] ;
您需要为每行分配内存:
tab[i] = (char *) malloc ( 2 * sizeof(char));
或者你可以保留你的阵列而不是(如果你想确定内存中发生了什么):
for (i=0; i<5; i++)
{
printf("Enter the first character for x");
scanf("%c", &x[i][0]);
printf('Enter the second character for x');
scanf("%c", &x[i][1]);
}
希望这有帮助