我是否错误地使用scanf?

每行输入都是一行,命令后跟数字(退出情况除外)。

我无法弄清楚我做错了什么。 此段正在查找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; } } } } 

是的,你错误地使用它(a) 。 这条线:

 scanf(" %s", command); 

没有界限检查输入。 如果有人在您的程序中输入超过19个字符,它将溢出char command[20]并导致未定义的行为。

scanf的两个主要问题是:

  • 因为没有办法控制输入多少数据,所以将它与无界%s一起使用。 我最喜欢的说法是scanf用于扫描格式化信息,格式化程度远远低于用户输入。
  • 不检查扫描的项目数量 – 扫描的可能性低于预期。

如果你想做得对,请看这里 。 它使用fgets来获取一条线,防止缓冲区溢出并检测问题。

一旦你sscanf一行作为一个字符串,你就可以安全地将它扫描到你的内心,因为你知道长度的上限,你总是可以返回到字符串的开头重新扫描(不是很容易做到的事情)输入流)。


(a)从 语法上讲,你所拥有的是正确的。 但是,从实际的语义角度来看(即,您的意思是发生什么,可能发生的事情),您的代码中有一个漏洞足以通过空中客车A380飞行:-)