【问题标题】:C: variables retain the value from previous operation instead of resettingC:变量保留先前操作的值而不是重置
【发布时间】:2021-04-28 14:29:10
【问题描述】:

我对 C 语言相当陌生,并且一直在尝试使用 Proteus 上的一些 arduino 项目。我最近尝试使用 Peter Fleury 的库实现键盘和 LCD 界面,到目前为止我输入的字符显示正常,但是在尝试打印到串行端口时遇到了问题。这就像键的值不断与每次迭代连接,所以输出有额外的字符,如下所示:

逗号之前的值来自'key'变量,它之后的值来自'buf'变量:

151 (我在第二次迭代中输入的 5 与第一次迭代中的 1 相加,然后放入我打印的变量中)

我认为这可能是由于我缺少/不正确使用指针,这是我的代码:

#include <avr/io.h>
#include <util/delay.h>

#include <stdlib.h>
#include <stdio.h>

#include "lcd.h"
#include "mat_kbrd.h"
#include "funciones.h"
#include "menu.h"

char buf[256];
char* coma = ","; 

int main(void)
{
    pin_init();
    serial_begin();
    lcd_init(LCD_DISP_ON);
    kbrd_init();
   
    bienvenida();
   
    while (1) {
        int i = 0;
        char key = 0;
      
        //char *peso;
        //int pesoSize = 1;
        char peso[100];
        //peso = calloc(pesoSize,sizeof(char));  
        int salida = 0;
         
        lcd_clrscr();
        desechos();
      
        key = kbrd_read();
     
        if (key != 0) {
            lcd_gotoxy(0,3);
            lcd_putc(key);

            _delay_ms(2000);
            lcd_clrscr();
            cantidad();

            while (salida != 1) {
                char keypeso = 0;
                keypeso = kbrd_read();
                //pesoSize = i;
                //peso = realloc(peso,pesoSize*sizeof(char));  

                if (keypeso != 0) {
                    if (keypeso == '+') {
                        salida = 1;
                        keypeso = *("");
                        lcd_clrscr();
                        calcularTotal(key,peso);
                        _delay_ms(2000);
                    } else {
                        lcd_gotoxy(i,1);
                        lcd_putc(keypeso);
                        snprintf(peso, sizeof peso, "%s%s",peso, &keypeso);
                        //strcat(peso,&keypeso);
                  
                        i++;
                        _delay_ms(2000);
                    }
                }
            }
        
            snprintf(buf, sizeof buf, "%s%s%s", &key,coma,peso);
            serial_println_str(buf); 
        }
    }
}

【问题讨论】:

  • 也许是snprintf(peso, sizeof peso, "%s%s",peso, &amp;keypeso); 你用自己覆盖了peso 数组。这看起来像是将keypeso 附加到peso 数组。
  • keypeso = *("");keypeso = '\0'; 的方式很奇怪。 keypeso 不是字符串,"%s", &amp;keypeso 没有意义。
  • 对 snprintf 使用相同的字符串作为输入和输出会导致未定义的行为

标签: c arduino avr


【解决方案1】:

&amp;key&amp;keypeso 指向单个char,但您使用的是%s 格式说明符,因此尝试将字符串读入单个char。对单个字符使用%c 而不是%s,并传递char 而不是字符地址..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2021-11-17
    相关资源
    最近更新 更多