Як я можу пройти довгий як параметр і отримати масив символів у відповідь?

Я новачок у C ++, тому я не впевнений, як виконати таке лиття.

Приклад:

long myLong = 12345L;
convertToCharArray(myLong); //returns an array with the digits of myLong

BTW я працюю з Arduino IDE.

0

5 Відповіді

Як і в багатьох інших речах у С, існує багато способів очищення цієї кішки.

Всі вони покладаються на вас спочатку, зробивши масив символів для зберігання результату в - ви не можете "повернути" масив з функції.

Найпростіший, хоч і нестандартний спосіб - це використовувати ltoa() , який є специфічною функцією avr-libc (не є частиною стандартних функцій libc):

long myLong = 12345L;
char myCharArray[10];//Enough room for the answer + 1 NULL char

ltoa(myLong, myCharArray, 10);

10 у цьому виклику функції визначає базу для представлення числа в базі 10 у цьому випадку: decimal.

Іншим способом, який є більш портативним, є форматування рядка за допомогою snprintf() :

snprintf(myCharArray, 10, "%dl", myLong);

У цьому випадку 10 - це максимальна довжина рядка, щоб запобігти переповненню 10-символьного масиву, який ми зробили.

Чистим способом Arduino було б скористатися страшним String клас:

String myString = String(myLong);
myString.toCharArray(myString, 10);

Знову ж у цьому прикладі 10 - це довжина буфера, у який ми копіюємо.

І їх більше. Ви можете зробити це вручну, наприклад, за символьними символами за допомогою операторів поділу та модуля.

2
додано

Ну для таких ситуацій я знайшов рішення.

Щоб перетворити Float або Long або int у формат масиву символів, можна скористатися dtostrf() . Синтаксис:

dtostrf(Source_var, StringLength, numVarsAfterDecimal,destinaton_var)

Source_var = змінна, яку потрібно конвертувати (float/int/long)

StringLength = Довжина рядка (для вашого випадку просто збережіть його 1)

numVarsAfterDecimal = необхідна кількість значень після десяткової крапки (залишиться нульовим)

destination_var = змінна char, до якої потрібно зберегти значення (не використовуйте квадратні дужки).

Для перетворення Long у масив виконайте вказаний нижче код

long myLong=12345L;
char var[5];
dtostrf(myLong,1,0,var);

Якщо все йде добре

Result will be like var[]={'1','2','3','4','5'}

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

For more info on dtostrf() : Link

1
додано
Використовуючи dtostrf() , ви неявно перетворюєте номер на float . Це дорого, непотрібно і втрачає точність, якщо число більше, ніж 2 ^ 24.
додано Автор Sprogz, джерело

Я теж новачок у C ++, тому я не впевнений, як виконати таке лиття.

щоб переробити, просто зробіть char покажчик і покажчик його на змінну. Досить просто.

якщо ви хочете перетворити ti ascii, існують численні способи, кожен зі своїми плюсами та мінусами.

I wrote a set of conversion routines here: https://dannyelectronics.wordpress.com/2017/07/04/a-very-fast-numeric-to-ascii-conversion-routine/

вони призначені для перетворення 8 цифр без знака довго до ASCII, але може бути легко переписати для перетворення 5 цифр.

0
додано

Це робота для покажчиків.

long myLong = 12345;
char* myCharArray = (char*)&myLong;

Тепер покажчики і масиви працюють однаково. Отже, тепер ви можете використовувати myCharArray [0] для позначення першого байта і myCharArray [1] для другого і т.д.

0
додано
Я думаю, що він хоче, щоб ASCII подання числа, а не сирі байти.
додано Автор Majenko, джерело
Мій телефон не дозволяє редагувати цей код, щоб виправити відповідний код. Якщо хтось не міг би редагувати, що для мене це дуже вдячний.
додано Автор Delta_G, джерело
Ну, він посилався на "лиття" в питанні, тому я сказав йому, як його віддати. Якщо ви просто хочете ascii використовувати Atol.
додано Автор Delta_G, джерело
Я дійсно мав на увазі ltoa.
додано Автор Delta_G, джерело
Ти правий. Представлення ASCII.
додано Автор user35512, джерело

Можливо, ви шукаєте функцію, яка повертає текстове представлення довгого числа. У цьому випадку існує фактично функція стандартної бібліотеки AVR ( avr- libc: stdlib.h ltoa ):

const size_t BUF_MAX = 32;
char buf[BUF_MAX];
const int RADIX = 10;

long myLong = 12345L;
ltoa(myLong, buf, RADIX);

Буфер, buf , буде містити текстове представлення числа, myLong , у вказаному RADIX .

Привітання!

0
додано
ltoa не стандартний. Це досить унікально для avr-libc.
додано Автор Majenko, джерело
Дозвольте мені виправити це для вашого :)
додано Автор Mikael Patel, джерело
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147