如何将整数转换为字符串?

时间:2011-09-05 00:49:06

标签: c microcontroller

我有一个带有以下原型的标准c函数

extern void lcd_puts(const char *s);

在我的其他功能中,我有类似的东西

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

我的问题是如何将count转换为字符串指针,以便能够将其发送到lcd_puts 应该在液晶屏幕上打印出计数

感谢

6 个答案:

答案 0 :(得分:6)

在微控制器上,你必须至少有点担心性能(排除sprintf),即使是这种芯片上的分区也是非常昂贵的操作。所以你想要为微控制器优化代码。

我在这里写了一些:http://ideone.com/SsEUW(需要进行一些更改才能用于C风格的字符串而不是C ++,但方法应该是明确的)

答案 1 :(得分:5)

这取决于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 :(得分:2)

这似乎是一种合理的方法。

#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;
}

答案 3 :(得分:1)

sprintf会格式化一个字符串

快速举例:

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

lcd_puts(buf);

答案 4 :(得分:0)

以你的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可以使用它。

答案 5 :(得分:0)

删除静电并整理:

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以上,但我认为这与我的编译器选项有关。