将整数拆分为字符串(没有很好解释,但是……)


大家好,
这被用作我如何进行这个思考练习。
我有一个从平衡传感器返回值的联合。 在串行监视器中工作正常,但我试图在液晶显示屏上显示它,一些探索表明该功能可以显示

C++
lcd.print()

只会在屏幕上打印一个字符。

我尝试过的:

将联合的输出转换为字符串,问题是该系统上不存在字符串,

C++
char[]

确实存在,所以我可以做吗

C++
char readOut[8];  
for(int a =0; a<=7; a++) 
  gyro.output.z = readOut[a];

问题是如何将数组拆分为单个值,然后将其上传到字符[]??

你明白我想去哪里了……
我正在尝试使用平衡传感器来准确报告“压力”是否水平(不是地板坡度),因此 muggins 的任务是证明它……平衡传感器返回(accel_t_gyro.value.z_gyro)这是由以下各项组成的联盟:

C
typedef union accel_t_gyro_union
{
struct {
uint8_t x_accel_h;
uint8_t x_accel_l;
uint8_t y_accel_h;
uint8_t y_accel_l;
uint8_t z_accel_h;
uint8_t z_accel_l;
uint8_t t_h;
uint8_t t_l;
uint8_t x_gyro_h;
uint8_t x_gyro_l;
uint8_t y_gyro_h;
uint8_t y_gyro_l;
uint8_t z_gyro_h;
uint8_t z_gyro_l;
} reg;

struct {
int16_t x_accel;
int16_t y_accel;
int16_t z_accel;
int16_t temperature;
int16_t x_gyro;
int16_t y_gyro;
int16_t z_gyro;
} value;
};

例如,它给出一个四位数字 4988。 美好的。 我使用的 LCD 一次只显示一个字符,例如,如果您发送“4988”,您会得到“4”,所以我在想是否将 int 转换为 char[] 数组我可以使用 for() 来计算位置和输出

C
for(int a = 0; a <= 7; a++) {
  // char[a] to int[a] type thing
}
lcd.print(a);

解决方案1

在C语言中,一个字符[] 实际上是一个字符串:在末尾添加一个空值“\0”,它是一个用于所有实际目的的字符串 – 这些称为“空终止字符串”

要输出到字符串,您必须分配给 readOut[a] 而不是从中读取,并将您的值拆分为字符 – 这并不困难,但取决于输入实际存储的内容。

Google 搜索“C 将整数转换为字符串”和“C 将整数转换为十六进制字符串”以获得一些想法。

解决方案2

根据提供的数据类型,传感器将结果存储为 16 位整数中的二进制数。 第一步是找出 z_gyro 的最大值和最小值是多少。 如果是4位带符号的值,则至少需要6个字符才能转换成字符串。 如果缓冲区 readOut 声明为 8 个字节,则使用输出的字符串长度没有任何害处。
我建议首先将整数值转换为字符串。 如果您可以使用 C 命令 sprintf(),这很容易:

C
sprintf(readOut, "%d", sensor.value.z_gyro);

然后使用 for 循环将字符串末尾的所有字符单独传递给 print() 函数。

C
for (int i = 0; i < strlen(readOut); i++)
    lcd.print(readOut[i]);

如果 sprintf() 函数不可用, itoa() 仍然可以使用,或者您可以自己在循环中编程转换。

附加信息“sprintf,事实上所有 f 函数(打印、扫描)都不存在!” 您可以自己编写一个简单的通用函数。 它可能看起来像这样:

C
void intToCString(int num, char* str) {
    if (num < 0) {
        *str++ = '-';
        num = -num;
    }

    int divisor = 1;
    while (num / divisor > 9) {
        divisor *= 10;
    }

    while (divisor > 0) {
        *str++ = '0' + (num / divisor);
        num %= divisor;
        divisor /= 10;
    }

    *str = '\0';
}

解决方案3

如果您没有 itoa,您可以使用 sprintf(),但这对于如此轻量的任务来说相当繁重。 以下内容应该适合您

C
int magnitude(int x)
{
    int i;
    x = abs(x);
    for(i = 0; x > 0; x /= 10, ++i);
    return i;
}

char *i2cstr(int i, char *buff) 
{
    int n = magnitude(i);

    /*  The following is only needed if i may be negative */ 
    int last = 0;
    if(i < 0) {
        i *= -1;
        buff[0] = '-';
        n += 1;
        last = 1;
    }
    /* end of dealing with negative numbers */
    
    buff[n] = 0;
    for(--n; n >= last; --n ) {
        buff[n] = i%10 + '0';
        i/= 10;
    }
    return buff;
}

注意:参数 buff i2cstr() 的大小必须适当。 对于 uint16_t 来说有 6 个字符,包括终止 nul。

解决方案4

如果只需要输出值,则不需要先转换为字符串。

C
void putaschar(int16_t n)
{
    if( n == 0 ) {
        /* special case for n == 0 */
        putchar('0');
    } else {
        if(n < 0) {
            /* oputput sign, and make n +ve */
            putchar('-');
            n *= -1;
        }

        /* determine largest power of 10 smaller than n */
        int16_t divisor = 10000;  /* maximum power of 10 that will fit in int16 */
 
        while( n / divisor == 0) {
            divisor /= 10;
        }

        /* send chars to the output device */
        do {
            putchar(n/divisor + '0');
            n %= divisor;
            divisor /= 10;
        } while(divisor > 0);
    }
}

上式中,假设 putchar() 代表将字符发送到显示器所需的任何魔法。

コメント

タイトルとURLをコピーしました