我正试图在C中打印以下二维字符串数组,如下所示:
char text[10][80] = {
"0", "Zero",
"1", "One",
"2", "Two",
"3", "Three",
"4", "Four",
};
输出应该是这样的:
0 Zero
1 One
2 Two
3 Three
4 Four
我已经写了以下程序:
#include <stdio.h>
int main()
{
char text[10][80] = {
"0", "Zero",
"1", "One",
"2", "Two",
"3", "Three",
"4", "Four",
};
int i, j;
for(i=0; i<6; i++)
{
for(j=0; j<1; j++)
{
printf("%s ", text[i]);
}
}
return 0;
}
它没有为我提供所需的输出。我试过几种方法,但没有成功。
您可以修改循环以获得所需的输出-
for(i=0; i<9; i=i+2){
printf("%s %sn", text[i], text[i+1]);
}
此循环将以所需格式打印索引为i
和i+1
的数组的内容。类似于索引0
和1
、2
和3
处的值等等。
您的数据被组织为一个由字符数组组成的10元素数组,每个数组的空间可容纳80个字符(包括0个终止符字符)1偶数元素0、2、4等包含数字文字,奇数元素1、3、4等则包含这些数字的名称。BTW:80个字符是为这种短字符串保留的大量空间。
输出应该格式化为两列,偶数元素在第一列,奇数元素在第二列,每行看起来如下:
number
&rar;name
↵
为了在循环中做到这一点,我发现2根据索引i
的奇数或偶数为printf
选择格式参数很有趣:3
#include <stdio.h>
char text[10][80] = {
"0", "Zero",
"1", "One",
"2", "Two",
"3", "Three",
"4", "Four",
};
int main(void) {
int i;
for (i=0; i<10; i++) {
printf( (i&1) ? "%sn" : "%st", text[i]);
}
return 0;
}
1尽管编写和格式化代码通常是一个好主意,尽可能接近应该解决的问题,但有时它会混淆实际情况。这就是编译器"看到的":
char text[10][80] = {
"0",
"Zero",
"1",
"One",
"2",
"Two",
"3",
"Three",
"4",
"Four",
};
这是一个方便的缩写形式来初始化用作字符串的字符数组,它在内部扩展到这个中
char text[10][80] = {
{'0'},
{'Z', 'e', 'r', 'o'},
{'1'},
{'O', 'n', 'e'},
{'2'},
{'T', 'w', 'o'},
{'3'},
{'T', 'h', 'r', 'e', 'e'},
{'4'},
{'F', 'o', 'u', 'r'},
};
终止的"\0"字符是自动添加的,因为每个初始化的值少于其元素数的数组都用默认值填充。
2它最好地反映了我所发现的给定任务。如果你对"最快"的代码感兴趣,ameyCU的答案似乎是一个不错的方法。
3请在实时演示中查看此代码。
从您的描述中不清楚您想要的是二维字符串数组还是二维字符数组(因此是一维字符串数组)。如果第一个是真的,那么试试:
int main()
{
char *text[10][80] = {
{"0", "Zero",},
{"1", "One",},
{"2", "Two",},
{"3", "Three",},
{"4", "Four",},
};
int i, j;
for(i=0; i<5; i++)
{
for(j=0; j<2; j++)
{
printf("%s ", text[i][j]);
}
printf("n");
}
return 0;
}
好吧,您可以遵循一个简单的逻辑,打印所有text[i]
,如果索引是奇数(偶数迭代),则添加一条换行符,如
for(i=0; i<10; i++)
{
printf("%st", text[i]);
if ( i%2 ) puts("");
}
否则,另一种奇特的方法是根据迭代(索引)号将(append)选项卡或换行符插入打印语句本身,如
for(i=0; i<10; i++)
{
printf("%s%c", text[i], i%2?'n':'t');
}