每行中数组的唯一元素

时间:2016-11-19 14:48:43

标签: c arrays

我有一个关于如何在数组中显示唯一元素的问题。该程序包含两个嵌套循环。第一个计数器用于行,另一个用于字母,第二个计数器按顺序输出数组中的字母。

我遇到的问题是,在第一行和第二行之后,一些元素开始重复(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

3 个答案:

答案 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