每行输入都是一行,命令后跟数字(退出情况除外)。
我无法弄清楚我做错了什么。此段正在查找store命令,然后操作存储需要:
char command[20];
while(strcmp(command, "exit") != 0)
{
/*scans for command strings inputted*/
scanf(" %s", command);
/* handles store command*/
if(strcmp(command, "store") == 0)
{
memory[0] = 1;
scanf("%d %d %d %d %d", &startx, &starty, &finishx, &finishy, &number);
for( i = startx; i < finishx; i++)
{
for(j = starty; j < finishy; j++)
{
square[i][j] = number;
}
}
}
}
答案 0 :(得分:8)
是的,你错误地使用了它(a)。这一行:
scanf(" %s", command);
对输入进行了 no 边界检查。如果有人在您的程序中输入超过19个字符,它将溢出char command[20]
并导致未定义的行为。
scanf
的两个主要问题是:
%s
一起使用,因为无法控制输入的数据量。我最喜欢的一句话是,scanf
是扫描格式化的信息,而且少的格式比用户输入少。如果您想要做得对,请参阅here。它使用fgets
来获取一条线,防止缓冲区溢出并检测问题。
一旦你将这一行作为一个字符串,你就可以安全sscanf
它的内容,因为你知道长度的上限,你总是可以回到起点要重新扫描的字符串(不是输入流容易做的事情)。
(a) 从句法上来说,你拥有的是正确的。但是,从实际的语义角度来看(即,您的意思是发生了什么与可能发生的事情相比),您的代码中有一个漏洞足以通过空中客车A380飞行: - )