二维字符数组

时间:2015-08-11 03:54:14

标签: c output

#include<stdio.h>

void main()
{
    char a[10][5] = {"hi", "hello", "fellow"};
    printf("%s",a[0]);
}

为什么此代码仅打印 hi

#include<stdio.h>

void main()
{
    char a[10][5] = {"hi", "hello", "fellow"};
    printf("%s",a[1]);
}

此代码正在打印&#34; hellofellow &#34;

6 个答案:

答案 0 :(得分:2)

您的代码:

 char a[10][5] = {"hi", "hello", "fellow"};

分配10 char [5]

“你好”占用5,所以终止\0没有空间,所以它会遇到“伙伴”

如果你尝试一下,a [3]应为“w”,因为“伙伴”太大而“w”从a[2]延伸到a[3]

除了未定义的行为之外,你想要做的事情令人困惑

答案 1 :(得分:2)

它会给取消定义行为,因为stringnull-terminated

元素hello的长度为5。 将您的数组声明为a[10][7],然后您将得到预期的输出。

请参阅此处 - https://ideone.com/c2zUs0

  

为什么此代码只打印

因为a[0][2] null表示已终止,因此会向您hi发送。

答案 2 :(得分:2)

  

为什么此代码只打印

您告诉printf打印存储在a[0]的字符串,该字符串恰好是"hi"

  

虽然此代码正在打印“hellofellow”

这个巧合,实际上你的代码应该被编译器拒绝a constraint violation

  

初始化程序不应尝试为未初始化的实体中包含的对象提供值。

字符串"fellow",特别是其末尾的'w'不适合正在初始化的char[5],这违反了C标准。也许巧合的是,你的编译器提供了一个扩展(在技术上使它成为非C编译器),所以你没有看到我做的the error messages

prog.c:3:6: error: return type of 'main' is not 'int' [-Werror=main]
 void main()
      ^
prog.c: In function 'main':
prog.c:5:37: error: initializer-string for array of chars is too long [-Werror]
     char a[10][5] = {"hi", "hello", "fellow"};
                                     ^

请注意,第二条错误消息是抱怨"fellow",而不是"hello"。您的"hello"初始化is valid by exception

  

字符类型数组可以由字符串文字或UTF-8字符串文字初始化,可选择用大括号括起来。字符串文字的连续字节(包括终止空字符,如果有空间或数组大小未知)初始化数组的元素。

重点是我的。强调部分指出,如果没有足够的空间容纳终端'\0'字符,则不会在初始化中使用。

答案 3 :(得分:1)

由于存储\0个字符的空间不足,这是未定义的行为

请注意,在字符串数组中,每个字符串分配的内存为5个字节。因此,对于a[1],没有足够的内存来存储\0字符,因为所有五个字节都分配有"hello"

  

因此,读取后续内存直到找到\0字符。

因此,您可以更改以下行:

char a[10][5] = {"hi", "hello", "fellow"};

char a[][7] = {"hi", "hello", "fellow"};
  

为什么此代码仅打印 hi

这是因为在\0已遇到a[0][2]字符,因此字符的读取已停止。

答案 4 :(得分:1)

您的代码的作用:

请看以下声明:

     public int compareTo(Person per) {
            int i= firstName.compareTo(per.firstName);
            if(0!= i) return i;
            else
            return lastName.compareTo(per.lastName);
        }

它分配char a[10][5] = {"hi", "hello", "fellow"}; 行。为10的每个索引分配5个字符。

问题是什么:

字符串Null Terminated除了给定的字符外,总是需要存储a,因此基本上使用的数组大小为null-terminator,额外的一个字节用于null终止符。在使用numOfCharacters+1个字符数初始化数组时,将跳过size。通常打印字符数组值,直到找不到第一个null terminator(空终止符)。另请查看this

解决方案:

无需担心此问题,您只需将大小设置为\0即可。您可以使用以下语句:

numOfCharactersInString + 1

由于最大字符串char a[10][7] = {"hi", "hello", "fellow"}; 包含"fellow"个字符,因此您需要设置大小6,这就是语句应使用6 + 1而不是char {{}的原因。 1}}

希望它有所帮助。

答案 5 :(得分:1)

当您将二维字符数组声明为

char a[10][5] = {"hi", "hello", "fellow"};

char a [10] [5]保留存储器以存储10个长度为5的字符串,这意味着4个字符+ 1&#39; \ 0&#39;字符。需要注意的是,数组元素存储在连续的内存位置。

a [0]指向第一个字符串,a [1]指向第二个字符串,依此类推。

此外,当您初始化数组时,其他未初始化的元素将变为0而不是垃圾值。

现在在您的情况下,在初始化后如果您尝试可视化数组,它将类似于

喜\ 0 \ 0 \ 0hellofello \ 0 \ 0 ...

现在命令

printf("%s",a[0]);

打印从&#39; h&#39;开始的字符。 &#34; hi&#34;并且当&#39; \ 0&#39;停止打印遇到了这样的事情&#34;嗨&#34;打印出来。

现在是第二种情况,

printf("%s",a[1]);

字符从&#39; h&#39;开始打印。 &#34;你好&#34;直到&#39; \ 0&#39;遇到了。现在&#39; \ 0&#39;只有在打印之后才会遇到字符&#34; hellofello&#34;因此输出。