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

  • 本文关键字:结尾 列表 打印 分隔 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);
} 
}

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

我会通过维护一些额外的状态来跟踪它是否是需要报告的第一个打开的储物柜来解决这个问题。 然后,只需在循环外打印周期,只有一次。

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储物柜数组。 但其余的逻辑保持不变。

一种选择是在此代码中使用类似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时才有效。 我离开它是因为这就是你使用的,但我通常会将一个变量设置为最大值并在循环中使用它。

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

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,这将适用于你的循环。

最新更新