我在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]);
但它不起作用!我不知道问题出在哪里
答案 0 :(得分:2)
char st, nd;
str[0] = {st,nd,nd,nd,st};
str[1] = {nd,st,st,st,nd};
您永远不会初始化st
或nd
,因此它们的值未定义。因此,使用未定义的值初始化数组,这可能不代表可打印的字符。
此外,您正在超越阵列的某个维度。您已将其定义为包含四个元素,但正在使用五个元素进行初始化。
此时,程序的行为未定义,可能会崩溃,可能会输出垃圾,或者根本无法执行任何操作。为了解决这个问题:
st
和nd
。str
的第二维。(并打开编译器警告!它可能会警告这两个问题。)
答案 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