[英]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]) == 1
, sizeof(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.