Лучший / распространенный способ разделения значений в C при их печати - PullRequest
3 голосов
/ 14 октября 2010

Я попробовал функцию поиска, но нашел только вопросы, касающиеся чтения в файлах, разделенных запятой / пробелом.

Мой вопрос, однако, как вы обычно подходите к этому. Скажем, у меня есть список / массив / ... значений, например {1, 2, 3, 4}, и я хочу напечатать их с разделителем.

Самая простая версия будет выглядеть примерно так:

#include <stdio.h>

int main(void)
{
     char list[] = {1, 2, 3, 4};
     unsigned int i;

     for (i = 0; i < 4; ++i)
     printf("%d, ", list[i]);

     return 0;
}

, который, очевидно, напечатает «1, 2, 3, 4». У меня проблема с запятой и пробелом в конце.

Теперь я могу сделать:

#include <stdio.h>

int main(void)
{
    char list[] = {1, 2, 3, 4};
    unsigned int i;

    for (i = 0; i < 4; ++i)
    {
        printf("%d", list[i]);
        if (i < 3)
            printf(", ");
    }

    return 0;
}

Но это не лучший способ сделать это. Может ли кто-нибудь указать мне правильное направление? Спасибо

PS: нет, я обычно не задаю жесткие значения
PPS: нет, я не пытаюсь писать файлы .csv;)

Ответы [ 7 ]

11 голосов
/ 14 октября 2010

Моя стандартная техника для этого:

const char *pad = "";
for (int i = 0; i < n; i++)
{
    printf("%s%d", pad, list[i]);
    pad = ", ";
}

Иногда начальное значение pad - это пробел, двоеточие или что-то еще, что работает в контексте.

4 голосов
/ 14 октября 2010

Я использую эту идиому:

assert(n > 0);
printf("%d", list[0]);
for (i = 1; i < n; ++i)
     printf(", %d", list[i]);

Один из ее недостатков в том, что она плохо масштабируется при n == 0, как простой цикл.Кроме того, вы можете добавить защиту от n == 0:

if (n > 0)
    printf("%d", list[0]);
for (i = 1; i < n; ++i)
     printf(", %d", list[i]);
2 голосов
/ 15 октября 2010

Я взял этот формат с условным оператором из K & R2:

for (i = 0; i < n; i++)
    printf("%d%s", list[i], i+1 < n ? ", " : "\n");
1 голос
/ 15 октября 2010

Ну, даже если мысль уже принята, никто не пришел с очевидным на мой вкус:

#include <stdio.h>
int main(void) {
    unsigned list[] = {1, 2, 3, 4};
    unsigned const n = 4;
    if (n) for (unsigned i = 0; ; ++i) {
        printf("%d", list[i]);
        if (i >= n) break;
        printf(", ");
    }
    printf("\n");
    return 0;
}
0 голосов
/ 15 октября 2010

Почему бы не просто еще одна версия, пока мы на ней? Вот что я обычно делаю

for (i=0;i<n;++i)
{
  if (i) printf(", ");
  printf("%d",list[i]);
}
0 голосов
/ 14 октября 2010
for ( printf("%d",list[i=0]) ; i < n ; printf(", %d", list[++i]) ) ;
0 голосов
/ 14 октября 2010

Используйте версию Михала Трибуса или наоборот

for (i = 0; i < (n - 1); ++i) 
{
     printf("%d, ", list[i]);
}
printf("%d", list[n - 1]);
...