В gcc Как дополнить числовую строку начальными 0? - PullRequest
2 голосов
/ 10 января 2011

У меня есть следующий код

#include <stdio.h>
#include <stdlib.h>

char UPC[]="123456789ABC";

main()
{
  int rc=0;

  printf("%016s\n",UPC);

  exit(rc);
}

В AIX с использованием компилятора xlC этот код печатается с ведущими нулями

0000123456789ABC

На Sles 11 он печатает начальные пробелы с помощью gcc версии 4.3.2 [gcc-4_3-ветка ревизия 141291]

123456789ABC

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

Ответы [ 7 ]

5 голосов
/ 10 января 2011
printf("%.*d%s", (int)(w-strlen(s)), 0, s);
4 голосов
/ 10 января 2011

Это поведение не определено, зависит от реализации (glibc, а не gcc). Это плохая практика, полагаться на это, ИМО.

Если вы точно знаете, что ваша строка числовая (шестнадцатеричное здесь), вы можете написать:

 printf("%016llX\n",strtoll(UPC,NULL,16));

Но помните об ошибках и переполнениях.

Редактировать, используя оригинальный постер:

Для десятичных чисел используйте следующее:

printf("%016llu\n",strtoll(UPC2,NULL,10));
2 голосов
/ 10 января 2011

%0*s не является стандартным. Вы можете сделать свой собственный отступ, хотя:

char buf[16];
memset(buf, '0', sizeof(buf));
printf("%.*s%s", sizeof(buf) - strlen(UPC), buf, UPC);
2 голосов
/ 10 января 2011

Что касается printf, влияние флага 0 на спецификатор преобразования s не определено. Вы ограничены printf?

[править] Вот альтернатива, если вы хотите (большинство проверок на ошибки отсутствуют ..):

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    char    UPC[] = "1234567890ABCDEF",
        out[sizeof UPC + 12]; /* substitute size for whatever you wish here, just make sure the original string plus NUL fits */
    if(sizeof out <= sizeof UPC) {
        return -1; /* you bad, bad man */
    }

    memset(out, '0', sizeof out);
    memcpy(out + sizeof out - sizeof UPC - 1, UPC, sizeof UPC);

    printf("%s\n", out);
    return 0;
}
1 голос
/ 10 января 2011

Короткий ответ - нет.

Ваш код при компиляции приведет к: "предупреждение: флаг '0' используется с '% s'"

Страница man для printfперечисляет спецификаторы формата, которые могут использоваться после флага «0», и они все числовые.

Однако вы можете создать строку с соответствующим количеством пробелов и распечатать ее перед вашим UPC.

1 голос
/ 10 января 2011
 char spbuf[30];
 sprintf(spbuf, "%%.%ds%%s\n", 16 - strlen(UPC));
 printf(spbuf,"0000000000000000",UPC); /* 16 '0' characters */
1 голос
/ 10 января 2011

Согласно справочной странице printf флаг 0 имеет неопределенное поведение для строковых аргументов.Вам нужно написать собственный код, чтобы набрать нужное количество символов «0».

...