Member 14161770 Ответов: 4

Печать длинных значений long int


Привет,

У меня есть целочисленное значение из 18 символов, которое я объявляю как long long int, скажем long long int license. Длина лицензии должна быть на самом деле 20 символов( действительная лицензия в моем случае всегда будет 20 символов), поэтому для удобства я добавляю 00 к лицензии и вводу.

Во время печати в нем отсутствуют ведущие 00-е годы. Как я могу напечатать ведущий 00 также в выходных данных?

Что я уже пробовал:

напр.:
длинный инт лицензии;
как я передаю его в качестве входного сигнала =00123456789876543219
ожидаемый o/p: 00123456789876543219
фактический выход:123456789876543219

4 Ответов

Рейтинг:
2

Stefan_Lang

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


Member 14161770

То же самое происходит, если вы запускаете онлайн-компилятор.
Итак, какие-то настройки отсутствуют?Мое платформе AIX

Рейтинг:
1

Rick York

Мистер Симмонс находится на правильном пути и k5054 также. Я использую вариант этого, чтобы сделать это :

sprintf( outputBuffer, "%020I64d", sixtyfourbitvalue );
Это будет двадцать цифр с ведущими нулями.

Кстати, в stdint.ч то есть это определение :
#define INT64_MAX        9223372036854775807i64
поэтому вы можете попробовать аналогичный формат. То есть, если вы используете visual studio. Это не стандартные форматы для 64-разрядных значений.

Для забавного упражнения попробуйте написать функцию, которая принимает 64-разрядное целое число и загружает текстовый буфер строкой, разделенной запятыми. Например: 1 234 456 890. В зависимости от вашего местоположения вы можете использовать точки для разделения тысяч, поэтому для получения бонусного кредита используйте локаль, чтобы выбрать соответствующий разделительный символ.


Member 14161770

То, что я пробовал, - это long long i=0;
printf("\nenter num\n");
scanf ("%lld",&i);
printf("%0020lld",i);


но в o/p я получаю 2 цифры дополнительно:

напр.:
я/п:100872063196938702
о/р:0010087206319693870246

В чем же ошибка?

Richard MacCutchan

Смотрите мое решение ниже.

Рейтинг:
1

Richard MacCutchan

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

printf("%.20lld\n", license);

Это позволит правильно вывести все значения, например:
00123456789876543219

00000000000123456789

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


Member 14161770

Кажется, что ничего не работает, и интересная часть заключается в том, что его часть-это печать какой-то случайной величины. Но на обычном компиляторе это работает

напр.:
printf("%020lld",i);
я/п: 102012000000000001
о/р : 0010201200000000000120

Richard MacCutchan

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

Richard MacCutchan

Ваша строка формата все еще неверна. Вам нужно использовать спецификатор точности, который использует точку (символ полной остановки) перед значением количества символов, т. е. %.20lld

Member 14161770

Если я попробую то же самое в своей env. its не работает. Я попробовал использовать онлайн-компилятор, он работает

Richard MacCutchan

Мне очень жаль, но я понятия не имею, как выглядит ваш код или что происходит, когда вы его запускаете. Какова ваша среда, какой компилятор вы используете, что на самом деле происходит в вашем коде?

Member 14161770

Сейчас это работает. Мой компилятор куб. см, ОКР-экс код :
главный()
{
long long i=0;
printf("\nenter num\n");
scanf ("%lld",&i);
printf("%.020lld\n",i);
}

Итак, загвоздка здесь в том, что есть шанс, что мое значение также будет иметь длину 20 цифр.
В этом случае, если я передаю 20-значное значение (меньше 2^64 -1), это печатает мусор. Остальное все дело (для всех цифр длины) его работы. В чем проблема для 20-значного числа?

Richard MacCutchan

Вы все еще используете неверную строку формата.
Прости, старина.

Member 14161770

Пожалуйста, проверьте :

#включить<stdio.h>
#include<stdlib.h>
главный()
{
long long int i=0,cp=0;
int count=0,d=0;
int l=20;
printf("\neneter num\n");
scanf ("%lld",&i);
cp=i;
в то время как(i != 0)
{
++считать;
i /= 10;
}
printf("%d - общее количество\n",count);
d=l-количество;
если(d!=0){
printf("%.020lld\n",cp);
}
еще{
printf("%lld",cp);
}
}

Richard MacCutchan

Извините за мой предыдущий комментарий, я неправильно понял.

Проблема в том, что максимальное значение для long long равно 18446744073709551615, но вы должны объявить переменную как unsigned, иначе она будет считаться отрицательным числом. Попробуйте выполнить следующий код:

unsigned long long int i=0;
printf("\nenter num\n");
scanf("%llu",&i);
printf("%.20llu\n",cp);

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

Member 14161770

Это решение, кажется, работает, кроме того, я попробую использовать строковую логику

Рейтинг:
0

#realJSOP

используйте sprintf, чтобы отформатировать его с ведущими нулями.


k5054

т.е..

long long license = 12345678987654321L;
printf("%020lld", license)


выход 00012345678987654321

Member 14161770

получение предупреждения как "(W) целочисленная константа 123456789876543219L вне диапазона"

#realJSOP

Ни один целочисленный тип (кроме десятичного) не может содержать 20 цифр. Попробуйте привести свое значение к десятичной дроби, прежде чем использовать printf.

Member 14161770

Есть ли кастинг в C?

Richard MacCutchan

Правильный формат-это %.20lld.