繁体   English   中英

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

[英]print list and separate values by a comma comma and end with a dot

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);
    } 
}

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

我将通过维护一些其他状态来跟踪此问题,该状态跟踪是否是需要报告的第一个打开的储物柜。 然后,只需在循环外打印一次,即可一次。

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(".");

演示版

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

一种选择是在此代码中使用类似于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[0]) == 1sizeof(lockers)才有效。 我离开它是因为那是您使用的,但是通常我会将变量设置为最大值,然后在循环中使用它。

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

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个整数元素。

如果lockers是指向数组的指针,则sizeof仅会导致指针的大小(可能为4或8个字节),并且如果数组中的元素数大于4或3,则不会访问指针所指向的数组的所有元素。 8。

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

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

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

您很幸运, sizeof(lockers[i])为1,可以为您的循环工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM