gpt4 book ai didi

c++ - Char 数组无法将字符保存为其成员。使用ATmega8的密码系统

转载 作者:行者123 更新时间:2023-11-30 16:18:28 25 4
gpt4 key购买 nike

我正在使用系统,从特定键盘读取一些符号,将其传递到ATmega8,然后将其一一传递到显示器(此步骤工作正常),但是如果我想显示所有符号数组,我发现动态数组在第一个位置保存空符号,在第二个位置保存空符号,并且后续字符保存正确。我没有看到代码中有任何错误,所以我需要帮助。

此代码函数必须返回从键盘读取串行数据的 4 元素 char 符号数组。

char* askPass(void){
int i;
char key;
#define PS 4
char* pass = (char*)calloc(PS, sizeof(char));

clear:
lcd_clear();
lcd_gotoxy(0, 0);
lcd_puts("Enter the password:");
lcd_gotoxy(0, 1);
lcd_puts(">>");
free(pass);
pass = (char*)calloc(0, sizeof(char));
for (i=0;i<PS;i++) pass[i] = '';

for (i=0; i<PS; i++) {
key = '-';
key = readKey();
lcd_gotoxy(3+i, 1);
if (key == 'C') {
goto clear;
} else if (key == '-'){
lcd_putchar('|');
delay_ms(10);
lcd_gotoxy(3+i, 1);
lcd_putchar(' ');
delay_ms(10);
lcd_gotoxy(3+i, 1);
i--;
} else {
pass = (char*)realloc(pass, i*sizeof(char));
*(pass+i) = key;
lcd_putchar(*(pass+i));
delay_ms(20);
}
}
/// there is an error:
/// serial input: 1234
/// lcd output: !* 34!
/// correct output: !1234!
lcd_gotoxy(0,2);
lcd_puts("!");
for (i=0; i<PS; i++) {
if (!(*(pass+i))) lcd_putchar('*');
else lcd_putchar(*(pass+i));
}
lcd_puts("!");
// end error block

return pass;
} // can't return correct array value

/* 所有测试都表明:

Serial input word: abcd
Output: !* cd!
Correct output: !abcd!

*/

最佳答案

你开始分配 4 个字节:

char* pass = (char*)calloc(PS, sizeof(char));

然后,在使用分配的数据之前调用free(pass),然后分配字节:

pass = (char*)calloc(0, sizeof(char));

如果只分配给空闲而不使用分配,或者分配零字节是没有意义的。分配零字节的行为是未定义的,但是尝试写入这样的分配不会发生任何好的或有用的事情。

连续重新分配一次添加一个字节也是不明智的。最好先分配一个合理长度的缓冲区,如果需要扩展,请在 block 中扩展多个字符。

在任何情况下都不清楚为什么要动态分配和重新分配以允许输入您不使用的任意数量的字符。简单地接受固定长度数组中的四个字符并丢弃任何无关的输入会更简单且更具确定性。

不存在“空字符”这样的东西,calloc 已经将分配初始化为零(nul 字符)。

我非常确定这段代码还有许多其他问题,但必须确定您想要做什么才能提供建议;您最好使用调试器。

关于c++ - Char 数组无法将字符保存为其成员。使用ATmega8的密码系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55893952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com