Как преобразовать целое число в строку? - PullRequest
3 голосов
/ 05 сентября 2011

У меня есть стандартная функция c со следующим прототипом

extern void lcd_puts(const char *s);

в другой моей функции у меня есть что-то вроде этого

send_to_lcd() {
  uint8_t count = 10
  lcd_puts(count);
}

мой вопрос: как мне преобразовать count в строковый указатель, чтобы иметь возможность отправить его в lcd_puts? который должен распечатать счет на ЖК-экране

спасибо

Ответы [ 6 ]

6 голосов
/ 05 сентября 2011

На микроконтроллере вам нужно хотя бы немного беспокоиться о производительности (что исключает sprintf), даже деление - очень дорогая операция на таких чипах.Итак, вы хотите оптимизировать код для микроконтроллера.

Я написал здесь несколько слов: http://ideone.com/SsEUW (потребуется несколько изменений для использования со строками в стиле C вместо C ++, но метод должен бытьясно)

5 голосов
/ 05 сентября 2011

Это зависит от того, что lcd_puts делает со своим аргументом.Возможны следующие варианты:

void send_to_lcd(uint8_t count)
{
    char str[SOME_CONSERVATIVE_MAX_LENGTH];
    sprintf(str, "%d", count);  // You might also snprintf() if it's available
    lcd_puts(str);
}

Но помните, что str выходит из области видимости, как только возвращается send_to_lcd().Поэтому, если lcd_puts «запоминает» свой входной аргумент, это будет иметь неопределенное поведение.

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

2 голосов
/ 05 сентября 2011

Это кажется разумным подходом.

#include <stdint.h>
#include <stdio.h>

const char *u82s(uint8_t count)
{
    static char aString[4];

    aString[3] = '\0';
    aString[2] = (count % 10) + '0';  count /= 10;
    aString[1] = (count % 10) + '0';  count /= 10;
    aString[0] = (count % 10) + '0';

    return aString;
}

int main(void)
{
    uint8_t z = UINT8_MAX;

    do
    {
        z++;
        printf("%s\n", u8ts(z));
    }
    while (z != UINT8_MAX);

    return 0;
}
1 голос
/ 05 сентября 2011

sprintf отформатирует строку

Быстрый пример:

char buf[50];
uint8_t count = 10;
sprintf(buf,'%d',count);

lcd_puts(buf);
0 голосов
/ 14 апреля 2017

Удалено статическое и приведено в порядок:

void UART_SendInt( uint16_t num )
{
    #define MAX_LEN         6   // 32767 is 6 characters with NULL terminator
    #define BASE_10         10  // Print decimal format

    uint8_t index = MAX_LEN - 1;
    char str[ MAX_LEN ];

    str[ index ] = '\0';
    while( index-- )
    {
        str[ index ] = ( num % BASE_10 ) + '0'; 
        num /= BASE_10;

        if( 0 == num )
        {
            UART_SendStr( &str[ index ] );
            break;
        }
    }

    UART_SendStr( "\r\n" );

    return;
}

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

0 голосов
/ 07 сентября 2011

Принимая ваши API в качестве основы.

/* One assumes this is a function that somehow displays a c string on the lcd. */
extern void lcd_puts(const char *s);


send_to_lcd() 
{
  uint8_t count = 10;     /* This is the variable to send to the screen         */ 

  lcd_puts(u82s(count));  /* This creates a string representation of count,     */
}                         /* which is then passed to the lcd_puts function      */
                          /* giving you the result you are after.  You question */
                          /* was how to make a c string out of a uint8.         */
                          /* this is a way to do it.                            */

Это в основном совпадает с выбранным вами ответом. Преобразуйте счетчик значений в строку c, чтобы lcd_puts могла использовать его.

...