打印列表并用逗号分隔值,并以点结尾

时间:2018-10-12 05:19:46

标签: c

printf("Open lockers: ");
for(int i = 0; i < sizeof(lockers); i++){
    if (lockers[i] == true){
        if(i == sizeof(lockers) - 1){
            printf(" %d.", i +1);
        }else
            printf(" %d,", i +1);
    } 
}

//这是我所得到的,但是当我更改列表大小时不起作用

3 个答案:

答案 0 :(得分:1)

我将通过维护一些其他状态来实现这一目标,该状态跟踪是否是需要报告的第一个打开的储物柜。然后,只需在循环外打印一个周期即可。

printf("Open lockers: ");
int first = 1;

for (int i=0; i < sizeof(lockers); i++) {
    if (lockers[i] == true) {
        if (first == 0) {
            printf(", ");
        }
        else {
            first = 0;
        }

        printf("%d", i + 1);
    }
}
printf(".");

Demo

注意:在演示中,我用bool数组替换了int储物柜数组。但是其余逻辑保持不变。

答案 1 :(得分:1)

一种选择是在此代码中使用类似pad的变量:

const char *pad = "";
printf("Open lockers:");
for (int i = 0; i < sizeof(lockers); i++)
{
    if (lockers[i])
    {
        printf("%s %d", pad, i + 1);
        pad = ",";
    }
}
putchar('.');

另一个变体是:

const char *pad = ":";
printf("Open lockers");
for (int i = 0; i < sizeof(lockers); i++)
{
    if (lockers[i])
    {
        printf("%s %d", pad, i + 1);
        pad = ",";
    }
}
putchar('.');

请注意,sizeof(lockers)仅适用于sizeof(lockers[0]) == 1。我离开它是因为这就是您使用的方法,但是通常我会将变量设置为最大值,然后在循环中使用它。

答案 2 :(得分:0)

您的循环条件可能是错误的

for(int i = 0; i < sizeof(lockers); i++){
    if (lockers[i] == true){

您不告诉我们lockers是什么。当您将其与索引一起使用时,它可能是数组或指向数组的指针。

如果lockers是一个数组,则sizeof将导致字节大小。除非元素的类型为char,否则最终将访问超出其分配内存的数组。 您可以使用sizeof(array)/sizeof(array[0])获得元素数。

int lockers[10];

使用类似的定义,您只有40个整数元素,而您只有10个。

如果lockers是指向数组的指针,则sizeof仅导致指针的大小(可能为4或8个字节),并且您将无法访问指针所在数组的所有元素指向数组的元素数是否大于4或8。

int *lockers = malloc(20 * sizeof(int));

使用这样的定义,您只能访问1或2个元素,而不是20个。

更新: 在评论中,我发现了缺少的信息。如果您将其放入问题而不是评论中,将会很有帮助。

您很幸运,sizeof(lockers[i])是1,可以在您的循环中使用。