我有以下代码
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdbool.h>
#define dimensions 5
int RandomNumInRange(int M, int N)
{
return M + rand() / (RAND_MAX / (N - M + 1) + 1);
}
char ** CreateWorld(int dim)
{
int i,j;
char **world = malloc(dim *sizeof(char*));
for(i=0;i<dim;i++)
world[i]=malloc(dim*sizeof(char));
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
world[i][j]=42;
return world;
}
void CreateCastle(char **world)
{
//assuming world is big enough
//to hold a match of 2
int randRow,randCol;
//1 to dimension -2 so we can spawn a 3x3 castle
randRow = RandomNumInRange(1,dimensions-2);
randCol = RandomNumInRange(1,dimensions-2);
printf("position: %d %d\n", randRow, randCol);
world[randRow][randCol]='c';
//fill the rest so castle is 3x3
//assuming there is enough space for that
world[randRow-1][randCol-1]=35;
world[randRow-1][randCol]=35;
world[randRow-1][randCol+1]=35;
world[randRow][randCol-1]=35;
world[randRow][randCol+1]=35;
world[randRow+1][randCol-1]=35;
world[randRow+1][randCol]=35;
world[randRow+1][randCol+1]=35;
}
void DisplayWorld(char** world)
{
int i,j;
for(i=0;i<dimensions;i++)
{
for(j=0;j<dimensions;j++)
{
printf("%c",world[i][j]);
}
printf("\n");
}
}
int main(void){
system("clear");
int i,j;
srand (time(NULL));
char **world = CreateWorld(dimensions);
DisplayWorld(world);
CreateCastle(world);
printf("Castle Positions:\n");
DisplayWorld(world);
//free allocated memory
free(world);
//3 star strats
char ***world1 = malloc(3 *sizeof(char**));
for(i=0;i<3;i++)
world1[i]=malloc(3*sizeof(char*));
for(i=0;i<3;i++)
for(j=0;j<3;j++)
world1[i][j]="\u254B";
for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%s",world1[i][j]);
puts("");
}
free(world1);
//end
return 0 ;
}
如果我使用system("clear")
命令,我得到一行“[3; J”
然后是预期的产出。如果我再次运行程序,我得到相同的乱码,然后是许多空白换行符,然后是预期的输出。如果我将system("clear")
命令放在注释中,那么“[3; J”和空白换行都不会显示,并且输出是预期的。
编辑:似乎错误不在代码中,而是在我的系统终端(未)设置的方式。谢谢大家的意见,我现在有很多有趣的东西需要阅读和学习。
答案 0 :(得分:0)
您的clear
命令发送的代码似乎与Gnome终端仿真器不兼容,我相信您将使用它。
清除控制台的正常控制代码是CSI H CSI J
。 (CSI
是控制序列初始值设定项:转义字符\033
后跟 [)。 CSI H
将光标发送到起始位置,CSI J
从光标位置清除到屏幕末尾。您还可以使用CSI 2 J
清除整个屏幕。
在Linux控制台和某些终端仿真程序上,您可以使用CSI 3 J
清除整个屏幕和回滚。我认为这样做是不友好的(并且我的系统上安装的clear命令没有。)
CSI序列通常可以包含用于分隔数字参数的分号。但是,J
命令不接受多个数字参数,分号似乎导致Gnome终端无法识别控制序列。无论如何,我不相信Gnome终端支持CSI 3 J
。
clear
命令通常使用terminfo数据库来查找终端的正确控制序列。它使用TERM
环境变量的值来标识终端,这表明您必须为该变量设置错误的值。尝试设置export TERM=xterm
,看看是否会得到不同的结果。如果可行,您将不得不弄清楚Linux Mint配置环境变量的位置并进行修复。
总的来说,您不需要使用system("clear")
来清除屏幕;对于这么简单的任务来说,这完全是太多的开销。最好使用tputs
包中的ncurses
。但是,它也使用terminfo数据库,因此您必须在任何情况下修复TERM
设置。