Печать ведущих нулей в C

Я пытаюсь найти хороший способ распечатать ведущий 0, например 01001 для Почтовый индекс. Хотя номер будет храниться как 1001, как это лучше сделать?

Я подумал об использовании операторов case или if, чтобы выяснить, сколько цифр в номере, а затем преобразовать его в массив char с дополнительными 0 для печати, но я не могу не думать, что может быть способ сделать это с помощью Синтаксис формата printf, который ускользает от меня.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
368
0
392 630
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Ответ принят как подходящий

printf("%05d", zipCode);

0 указывает, чем вы заполняете, а 5 показывает ширину целого числа.

Пример 1: Если вы используете "%02d" (полезно для дат), это добавит нули только для чисел в столбце единиц. Например, 06 вместо 6.

Пример 2: "%03d" добавит 2 нуля для одного числа в столбце единиц и 1 ноль для числа в столбце десятков. Например, номер 7 дополнен до 007, а номер 17 дополнен до 017.

Пожалуйста, не храните почтовые индексы как числа. В почтовых индексах некоторых стран есть буквы.

Sec 30.09.2008 20:57

Для вашего случая этого будет достаточно. Как можно иметь ведущие нули в целом числе неизвестной длины?

Dominic Motuka 10.05.2018 17:58

Вам нужно знать максимальную длину последней набитой строки. В качестве альтернативы, если вы всегда хотели 5 ведущих нулей, тогда "00000" + integer.to_s. так далее

mlambie 04.03.2020 08:21

printf допускает различные варианты форматирования.

Пример:

printf("leading zeros %05d", 123);

Вы ставите ноль перед минимальной шириной поля:

printf("%05d", zipcode);

Если вы находитесь на машине * nix:

man 3 printf

Откроется страница руководства, похожая на:

0 The value should be zero padded. For d, i, o, u, x, X, a, A, e, E, f, F, g, and G conversions, the converted value is padded on the left with zeros rather than blanks. If the 0 and - flags both appear, the 0 flag is ignored. If a precision is given with a numeric conversion (d, i, o, u, x, and X), the 0 flag is ignored. For other conversions, the behavior is undefined.

Несмотря на то, что вопрос касается C, страница это может помочь.

зачем нужен номер 3?

eri0o 25.02.2018 17:47

@Elric Если вы дадите числовой аргумент команде man, она сузит его до этого конкретного раздела. Без него вы получите справочную страницу для команды оболочки printf вместо функции C.

Paul Tomblin 25.02.2018 19:51

sprintf(mystring, "%05d", myInt);

Здесь «05» означает «использовать 5 цифр с ведущими нулями».

Правильное решение - сохранить почтовый индекс в базе данных как STRING. Несмотря на то, что это может выглядеть как число, это не так. Это код, в котором каждая часть имеет значение.

Число - это то, над чем вы производите арифметические вычисления. Почтовый индекс - это не то.

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

EvilTeach 30.09.2008 21:32

Полагаю, мне следовало перефразировать это более точно, чтобы проиллюстрировать, что я хотел увидеть, как я могу использовать начальные и конечные символы на языке, с которым я не был знаком. В будущем я буду более осторожен с произвольными примерами!

zxcv 01.10.2008 03:31

В почтовых индексах других стран, например Великобритании, есть буквы.

jjxtra 07.09.2016 00:21

Почтовый индекс - это поле с высокой степенью локализации, и многие страны имеют символы в своих почтовых индексах, например, Великобритания, Канада. Следовательно, в этом примере вы должны использовать поле string / varchar для его хранения, если в какой-то момент вы будете отправлять или получать пользователей, клиентов, клиентов и т. д. Из других стран.

Однако в общем случае следует использовать рекомендуемый ответ (printf("%05d", number);).

Вы избавите себя от кучи проблем (в долгосрочной перспективе), если сохраните почтовый индекс в виде символьной строки, а это не число, а это не так.

Если бы только кто-нибудь объяснил, как обнулить массив символов. Существует даже решение, которое использует atoi () для преобразования массива char в init, а затем использует% 05d. Надеюсь, это не единственное решение.

Niko 15.01.2019 18:31

@Niko Ну, я думаю, вы бы использовали memcpy и так далее, чтобы обнулить массив символов. Но зачем вам это делать?

OmarL 18.02.2021 12:19

Более гибкий.. Вот пример печати строк выровненных по правому краю чисел с фиксированной шириной и заполнением пробелами.

//---- Header
std::string getFmt ( int wid, long val )
{  
  char buf[64];
  sprintf ( buf, "% *ld", wid, val );
  return buf;
}
#define FMT (getFmt(8,x).c_str())

//---- Put to use
printf ( "      COUNT     USED     FREE\n" );
printf ( "A: %s %s %s\n", FMT(C[0]), FMT(U[0]), FMT(F[0]) );
printf ( "B: %s %s %s\n", FMT(C[1]), FMT(U[1]), FMT(F[1]) );
printf ( "C: %s %s %s\n", FMT(C[2]), FMT(U[2]), FMT(F[2]) );

//-------- Output
      COUNT     USED     FREE
A:      354   148523     3283
B: 54138259 12392759   200391
C:    91239     3281    61423

Функция и макрос спроектированы таким образом, чтобы printfs было более читабельным.

Я не уверен на 100% в вашем намерении с макросом, но похоже, что вы хотели определить функцию, например #define FMT(x) (getFmt(8,x).c_str()) (обратите внимание на параметр Икс!), А не переменную (что и делает ваш код).

Ponkadoodle 02.08.2014 07:47

Если вам нужно сохранить почтовый индекс в массиве символов zipcode[], вы можете использовать это:

snprintf(zipcode, 6, "%05.5d", atoi(zipcode));

Вывести число с ведущими нулями можно двумя способами:

Использование флага 0 и спецификатора ширины:

int zipcode = 123;
printf("%05d\n", zipcode);  // outputs 00123

Используя спецификатор точности:

int zipcode = 123;
printf("%.5d\n", zipcode);  // outputs 00123

Разница между ними заключается в обработке отрицательных чисел:

printf("%05d\n", -123);  // outputs -0123 (pad to 5 characters)
printf("%.5d\n", -123);  // outputs -00123 (pad to 5 digits)

Почтовые индексы вряд ли будут отрицательными, поэтому это не имеет значения.

Однако обратите внимание, что почтовые индексы могут содержать буквы и тире, поэтому их следует хранить в виде строк. Включение начальных нулей в строку очень просто, поэтому проблема решается гораздо проще.

Обратите внимание, что в обоих приведенных выше примерах значения ширины или точности 5 могут быть указаны как аргумент int:

int width = 5;
printf("%0*d\n", width, 123);  // outputs 00123
printf("%.*d\n", width, 123);  // outputs 00123

Есть еще одна хитрость: точность 0 не приводит к выводу значения 0:

printf("|%0d|%0d|\n", 0, 1);  // outputs |0|1|
printf("|%.0d|%.0d|\n", 0, 1);  // outputs ||1|

Отличный ответ, касающийся того факта, что OP печатает целое число со знаком. Форматирование printf - действительно сильная особенность C.Я вообще фанат C++, но когда дело доходит до подобных вещей, я склоняюсь к простому C.

nielsen 17.02.2021 12:46

Другие вопросы по теме