C - 打印出奇怪的字符

时间:2015-06-04 18:38:42

标签: c

我编写了一个小程序,它将成为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'字符。我犯了什么错误,如何解决?

4 个答案:

答案 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