我是否错误地使用scanf?

时间:2012-02-27 03:08:48

标签: c

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

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

1 个答案:

答案 0 :(得分:8)

是的,你错误地使用了它(a)。这一行:

scanf(" %s", command);

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

scanf的两个主要问题是:

  • 将其与无界%s一起使用,因为无法控制输入的数据量。我最喜欢的一句话是,scanf是扫描格式化的信息,而且的格式比用户输入少。
  • 不检查扫描的项目数量 - 扫描的可能性低于预期。

如果您想要做得对,请参阅here。它使用fgets来获取一条线,防止缓冲区溢出并检测问题。

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


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