char a [50] [50]在C中是什么意思?

时间:2019-07-17 09:57:48

标签: c string

我正在做一个与弦有关的作业。 这是代码


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'的无效转换 我真的不明白这是怎么回事。

4 个答案:

答案 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 -除了读取以外,没有清除多余输入的良好,安全,便携式方法使用fflushgetchar


  1. 这就是为什么您将fgetca更改为char [50][50]时收到错误消息的原因-在这种情况下,char [50]的类型为a[i] ,而不是char,并且char *的值不是地址
  2. Microsoft的Visual Studio C编译器是一个明显的例外-它将清除输入流中多余的输入。但是,这特定于MSVC,不能在不同的编译器之间移植。对于“冲洗”语义,该操作也有点荒谬。

答案 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中存储整行,因此会出现错误