我是否错误地使用scanf?

2 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;
                }
            }
        }
     }
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 8

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

scanf(" %s", command);
Run Code Online (Sandbox Code Playgroud)

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

两个主要问题scanf是:

  • %s因为没有办法控制输入的数据量,所以使用它是无限制的.我最喜欢的说法是scanf扫描格式化的信息,并且格式化程度远远低于用户输入.
  • 不检查扫描的项目数量 - 扫描的可能性低于预期.

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

一旦你sscanf把这一行作为一个字符串,你可以放心地把它放在心里,因为你知道长度的上限,你总是可以回到字符串的开头重新扫描(不是一个容易做的事情.输入流).


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

  • +1 对于一个很好的答案:正确诊断问题、描述解决方案并提供良好“模型”的链接是三连胜。我希望所有的答案都是这样的。 (2认同)