簡體   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