我编写了一个小程序,它将成为windows控制台中的文本编辑器。这就是我现在所写的:
#include <Windows.h>
#include <conio.h>
#include <stdlib.h>
int main()
{
int space = 20;
int used = 0;
int key = 0;
char* text = malloc(sizeof(char) * space);
while (key != 27)
{
if (used >= space)
{
space += 20;
text = realloc(text, space);
}
key = getch();
if (key == 8)
{
used--;
system("cls");
for (int i = 0; i < used; i++)
{
putch(text[i]);
}
}
else
{
used++;
text[used] = key;
putch(text[used]);
}
}
free(text);
return 0;
}
当我按下键盘上的字母时打印工作正常。问题是当我按下退格键并尝试删除一个字符时。它开始在我写的文本中打印随机的'I'字符。我犯了什么错误,如何解决?
答案 0 :(得分:4)
关闭一个错误。变化
used++;
text[used] = key;
到
text[used] = key;
...
used++;
一些风格笔记:
首先,使用字符文字而不是原始数字代码;例如,而不是写
if (key == 8)
使用
if (key == '\b')
如果没有预定义的字符文字(例如转义字符),请创建一个符号常量并使用:
#define ESC 27
...
while (key != ESC)
这将使您的代码更容易理解其他人。
其次,小心realloc
;如果它不能满足请求,它将返回NULL。如果将NULL值分配给text
指针,则将丢失对已分配的内存的唯一引用。做以下事情会更好:
char *tmp = realloc( text, space + 20 );
if ( tmp )
{
text = tmp;
space += 20;
}
这样,如果realloc
失败,您仍然可以引用先前分配的内存,允许您干净地free
,或以某种方式从错误中恢复。
答案 1 :(得分:1)
for each in tree.iter():
print each.tag
if each.text == "Trust":
return True
return False
。第一次text[0]
被写入text[used]
已经used
,因为它之前会增加。但是在1
上,您正在从backspace
开始打印text
,这是未初始化且包含垃圾。
答案 2 :(得分:1)
我不确定这是唯一的问题,但我可以在第一眼看到的一个问题 - 使用&#39;在插入之前(意味着 - 你开始插入文本[1])并且reprintig从零开始(意味着 - 你开始用文本[0]打印)第一个值被施肥。
抱歉英语不好并希望得到帮助。
答案 3 :(得分:1)
以下代码仍然存在“off-by-one”错误,
以下代码需要添加错误检查 对malloc()和realloc()的调用。
但是,它是便携式的,可以干净地编译,并且无需输出垃圾字符即可执行所需的功能。
但是,它仍然存在换行符的逻辑问题。
//#include <Windows.h>
//#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
int space = 20;
int used = 0;
int key = 0;
char* text = malloc(sizeof(char) * space);
while (key != 27) // escape
{
if (used >= space)
{
space += 20;
text = realloc(text, space);
}
key = getchar();
if (key == 8) // backspace
{
used--;
system("cls");
for (int i = 0; i < used; i++)
{
putc(text[i], stdout);
}
}
else
{ // all other key strokes
used++;
text[used] = key;
putc(text[used], stdout);
}
} // end while
free(text);
return 0;
} // end function: main