我有一个关于如何在数组中显示唯一元素的问题。该程序包含两个嵌套循环。第一个计数器用于行,另一个用于字母,第二个计数器按顺序输出数组中的字母。
我遇到的问题是,在第一行和第二行之后,一些元素开始重复(C primer plus第6版241pg num 4)
#include <stdio.h>
int main(void){
char lets[29] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for(int i =0; i<6; i++)
{
for(int j=0; j<=i; j++)
{
printf("%c", lets[j+i]);
}
printf("\n");
}
}
我的输出
A
BC
CDE
DEFG
EFGHI
FGHIJK
必需的输出
A
BC
DEF
GHIJ
KLMNO
PQRSTU
答案 0 :(得分:1)
您需要一个额外的偏移量,或者您永远不会到达字母表的末尾:
char lets[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // no need to give array size, automatic size is OK
int start = 0;
for(int i =0; i<6; i++)
{
for(int j=0; j<=i; j++)
{
printf("%c", lets[j+i+start]);
}
start += i; # shift letters
printf("\n");
}
结果:
A
BC
DEF
GHIJ
KLMNO
PQRSTU
答案 1 :(得分:1)
试试这个:
#include <stdio.h>
int main(void){
char lets[29] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int k=0;
for(int i =0; i<6; i++)
{
for(int j=0; j<=i; j++)
{
printf("%c", lets[k]);
k++;
}
printf("\n");
}
}
输出:
A
BC
DEF
GHIJ
KLMNO
PQRSTU
答案 2 :(得分:1)
对于初学者,你声明数组lets
有29个元素,虽然它只用27个元素显式初始化,包括终止零。
char lets[29] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
^^^
其次不清楚为什么使用这个幻数6
for(int i =0; i<6; i++)
^^^
如果您使用其他字母,则代码无效。
考虑到您应该检查当前输出的符号是否在终止零之外。
程序可以按以下方式查看
#include <stdio.h>
int main(void)
{
char lets[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for ( size_t i = 0, j = 0; lets[j]; i++ )
{
for ( size_t k = i + 1; lets[j] && k; --k ) putchar( lets[j++] );
putchar( '\n' );
}
return 0;
}
它的输出是
A
BC
DEF
GHIJ
KLMNO
PQRSTU
VWXYZ
它的工作不依赖于字符数组的大小。它可以与任何字母表一起使用。
考虑例如
#include <stdio.h>
int main(void)
{
char lets[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
for ( size_t i = 0, j = 0; lets[j]; i++ )
{
for ( size_t k = i + 1; lets[j] && k; --k ) putchar( lets[j++] );
putchar( '\n' );
}
return 0;
}
在这种情况下,输出看起来像
A
BC
DEF
GHIJ
KLMNO
PQRSTU
VWXYZab
cdefghij
klmnopqrs
tuvwxyz