显示2D字符数组

时间:2014-08-14 16:38:44

标签: c

我在C中的字符串有一个小问题。 我想声明2D字符数组并用2个变量初始化它:

typedef char tab[4];
tab str[2];
char st, nd;
str[0] = {st,nd,nd,nd,st};
str[1] = {nd,st,st,st,nd};

我的目的是声明它能像我想要的那样初始化,但是当我想要显示它时我的问题:

for(i = 0;i < 2;i++)
    for(j = 0;j < 4;j++)
        printf("%c", str[i][j]);

但它不起作用!我不知道问题出在哪里

2 个答案:

答案 0 :(得分:2)

char st, nd;
str[0] = {st,nd,nd,nd,st};
str[1] = {nd,st,st,st,nd};

您永远不会初始化stnd,因此它们的值未定义。因此,使用未定义的值初始化数组,这可能不代表可打印的字符。

此外,您正在超越阵列的某个维度。您已将其定义为包含四个元素,但正在使用五个元素进行初始化。

此时,程序的行为未定义,可能会崩溃,可能会输出垃圾,或者根本无法执行任何操作。为了解决这个问题:

  1. 在使用之前初始化stnd
  2. 不要将超过四个元素写入str的第二维。
  3. (并打开编译器警告!它可能会警告这两个问题。)

答案 1 :(得分:0)

首先,您将数组定义为每个&#34;行&#34;但正试图用5个初始化器初始化它。

typedef char tab[4];
//...
str[0] = {st,nd,nd,nd,st};

数组1)没有赋值运算符,2){st,nd,nd,nd,st}不是表达式。 也没有初始化st和nd。

您可以在声明数组时初始化数组。如果您需要在定义后更改其值,则必须手动执行此操作。

例如

#include <stdio.h>
#include <string.h>

#define N   5

int main(void) 
{
    typedef char tab[N];
    char st = 'A', nd = 'B';
    tab str[2] = 
    {
        { st, nd, nd, nd, st },
        { nd, st, st, st, nd }
    };
    int i, j;

    for ( i = 0; i < 2; i++ )
    {
        for ( j = 0; j < N; j++ ) printf( "%c", str[i][j] );
        puts( "" );
    }

    puts( "" );

    st = 'B';
    nd = 'A';

    memset( str[0], nd, N );
    str[0][0] = str[0][N-1] = st;

    memset( str[1], st, N );
    str[1][0] = str[1][N-1] = nd;

    for ( i = 0; i < 2; i++ )
    {
        for ( j = 0; j < N; j++ ) printf( "%c", str[i][j] );
        puts( "" );
    }

    return 0;
}

输出

ABBBA
BAAAB

BAAAB
ABBBA