我正在做一个与弦有关的作业。 这是代码
int main(){
char a[50][50];
int n;
printf("Enter the value of n\n");
scanf("%d",&n);
printf("Enter %d names\n",n);
fflush(stdin);
for(int i=0; i<n; i++){
gets(a[i]);
}
我试图将char a [50] [50]更改为char a [50],但是整个程序没有运行,并伴随以下错误消息:“从'char'到'* char'的无效转换 我真的不明白这是怎么回事。
答案 0 :(得分:1)
char a[50][50]
声明a
是由50个char
组成的50个数组。
然后a[0]
是一个由50个char
组成的数组,a[1]
,a[2]
也是如此。 a[3]
,依此类推,直到a[49]
。有50个独立的数组,每个数组都有50个char
。
由于a[0]
是50个char
的数组,所以a[0][0]
是char
。通常,a[i][j]
是数组j
的字符i
。
gets(a[i])
表示从输入中读取字符并将其放入a[i]
中。为此,a[i]
必须是char
的数组-gets
读取多个字符并将它们放入数组中。如果a[i]
是单个字符,则gets
无法正常工作。
尽管gets(a[i])
表示将字符放入a[i]
,但是它通过传递地址而不是传递数组来工作。当将数组用于表达式而不是sizeof
或地址运算符&
时,C会自动将其转换为指向其第一个元素的指针。由于a[i]
是一个数组,因此它将自动转换为指向其第一个元素的指针(指向a[i][0]
的指针)。 gets
接收此指针,并使用它来填充从标准输入流中读取的字符。
答案 1 :(得分:0)
基本上,在C语言中,它表示长度为0到50的数组,该数组的每个单元格中包含字符值50。
答案 2 :(得分:0)
char a[50][50]
声明a
为由char
的50个元素的数组组成的50个元素的数组。这意味着每个a[i]
是char
的50个元素的数组。它将在内存中布局,例如:
+---+
a: | | a[0][0]
+---+
| | a[0][1]
+---+
| | a[0][2]
+---+
...
+---+
| | a[0][49]
+---+
| | a[1][0]
+---+
| | a[1][1]
+---+
...
+---+
| | a[1][49]
+---+
| | a[2][0]
+---+
...
此代码在a
中最多存储50个字符串,每个字符串最多49个字符(IOW,每个a[i]
可以存储49个字符的字符串)。在C语言中,字符串是包含0值终止符的字符值序列。例如,字符串"hello"
表示为序列{'h', 'e', 'l', 'l', 'o', 0}
。尾随0
标记字符串的结尾。字符串处理函数和带有puts
的{{1}}和printf
之类的输出函数需要0终止符才能正确处理字符串。
字符串以字符类型的数组存储,%s
(用于ASCII,UTF-8或EBCDIC字符集)或char
用于“宽”字符串(字符集需要8个以上)大约要编码的位)。 N个字符的字符串需要一个数组,该数组的宽度至少为 N + 1个元素,以表示0终止符。
除非它是wchar_t
或一元sizeof
运算符的操作数,否则它是用于初始化字符类型数组(即类型为 expression 的字符串)的字符串文字&
“的N元素数组将被转换(“衰变”)为类型为“ T
的指针”的表达式,该表达式的值将是该元素的第一个元素的地址。数组。
致电时
T
表达式gets( a[i] );
从类型“ a[i]
的50元素数组”转换为“指向char
的指针”,表达式的值是第一个元素的地址(char
) 1 的数组。 &a[i][0]
将从标准输入中读取字符,并将其存储到从该地址开始的数组中。请注意,gets
不再是标准C库的一部分-在2011版标准中已删除,因为它不安全。 C不需要对数组访问进行任何形式的边界检查-如果键入的字符数超出了目标缓冲区可容纳的大小(在这种情况下为50个),则这些多余的字符将立即写到内存中最后一个元素之后阵列,可能导致各种混乱。缓冲区溢出是一种流行的恶意软件利用。您应该将gets
调用替换为
gets
,它将从标准输入中读取多达49个字符到fgets( a[i], 50, stdin );
中。请注意,任何多余的字符都会留在输入流中。
此外,没有为输入流定义a[i]
的行为 2 -除了读取以外,没有清除多余输入的良好,安全,便携式方法使用fflush
或getchar
。
fgetc
从a
更改为char [50][50]
时收到错误消息的原因-在这种情况下,char [50]
的类型为a[i]
,而不是char
,并且char *
的值不是地址。
答案 3 :(得分:-2)
该程序似乎将n
名称存储在数组a
中。它首先询问名称的数量,然后询问名称。方法char *gets(char *str)
将每个不同的行存储在a
的条目中。
n
具有2个维度。第一个表示名称的数量,第二个表示每个名称的长度。像n[number_of_names][lenght_of_name]
但是,如果用户提供的n> 50或名称包含的字符超过50个,则可能会崩溃。
此外,gets()
是危险的。参见this other post。
编辑:将a
更改为一维会使程序尝试在char中存储整行,因此会出现错误