我正在尝试在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;
}
它没有为我提供所需的输出。我尝试了几种方法,但没有运气。
答案 0 :(得分:6)
您可以修改循环以获得所需的输出 -
for(i=0; i<9; i=i+2){
printf("%s %s\n", text[i], text[i+1]);
}
此循环将以所需格式打印索引为i
和i+1
的数组内容。与索引0
和1
,2
和3
等处的值类似。
答案 1 :(得分:2)
您的数据被组织为一个10元素的char数组数组,每个数组都有80个字符的空间(包括零终止符号)。 1 偶数元素,0,2,4等包含数字文字,奇数元素1,3,4等包含这些数字的名称。顺便说一句:80个字符是为这么短的字符串保留的很多空间。
输出应格式化为两列,第一列中的偶数元素和第二列中的奇数元素,每行如下所示:
number
→name
↵
至于在循环中执行此操作,我发现有趣的 2 到 为printf
选择格式参数 ,具体取决于索引i
是奇数或偶数: 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) ? "%s\n" : "%s\t", text[i]);
}
return 0;
}
1 尽管编写代码并将其格式化为尽可能接近应该解决的问题通常是个好主意,但它有时会混淆实际发生的事情。这就是编译器“看到”的内容:
char text[10][80] = {
"0",
"Zero",
"1",
"One",
"2",
"Two",
"3",
"Three",
"4",
"Four",
};
...这是一个方便的简短形式来初始化用作字符串的char数组,它在内部扩展到了这个
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's answer似乎是一个很好的方法。
3 请参阅live demo中运行的此代码。
答案 2 :(得分:0)
好吧,你可以遵循一个简单的逻辑,打印所有text[i]
并在索引为奇数(偶数迭代)时添加换行符,如
for(i=0; i<10; i++)
{
printf("%s\t", text[i]);
if ( i%2 ) puts("");
}
否则,另一种奇特的方法是将(追加)标签或换行符插入到print语句本身中在迭代(索引)号上,如
for(i=0; i<10; i++)
{
printf("%s%c", text[i], i%2?'\n':'\t');
}
答案 3 :(得分:0)
从您的描述中不清楚您是否需要二维字符串数组或二维字符数组(因此是一维字符串数组)。如果第一个为真,那么尝试:
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;
}