来自用户的样本输入:

A10


尝试阅读此输入

scanf_s("%c%d", &playerX, &playerY, 10);


来自用户的输入是否需要定界?是否可以像这样阅读?

编辑:我已经测试了它,它只是崩溃。

编辑2:解决方案:scanf_s(“%c%d”,&playerX,1,&playerY);

最佳答案

使用scanf_s的解决方案很棘手:

char playerX;
int playerY;

if (scanf_s("%c%d", &playerX, (size_t)1, &playerY) == 2) {
    /* input parsed correctly */
    /* input stopped after the last digit in playerY */
    /* You cannot limit the number of digits this way */
} else {
    /* end of file or missing number */
    /* input stopped before the offending character */
}


scanf_s不能很好地解决scanf的许多缺点。数组大小必须在cs[格式的每个指针参数之后传递。但是,此大小必须作为rsize_t传递,这与size_t相同,但有最大值限制。传递1是错误的,因为1int,并且scanf_s接受可变数量的参数,因此不会自动转换多余的参数。如果在intsize_t大小不同的体系结构上(例如64位窗口,Linux和OS / X),If将失败。

您可以通过提高编译器的警告级别来避免类似的细微问题。 gcc -Wall -Werrorclang -Wall -Werror是一个好的开始。永远不要忽略这些有用的警告,如果您不理解它们,则可能不知道您的代码实际上是做什么的。

除非您的编码规则或编译器强制使用scanf_s,否则使用scanf更简单,并且对于这种格式也一样安全:

if (scanf("%c%d", &playerX, &playerY) == 2) ...

关于c - 用scanf读取无限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29477986/

10-13 05:25