样品输入:与scanf函数读而不划界用户
A10
试图在这一输入
scanf_s("%c%d", &playerX, &playerY, 10);
是否从用户输入需要阅读要划界?可以这样读吗?
编辑:我测试过了,它只是崩溃。
编辑2:解决方案:scanf_s(“%c%d”,& playerX,1,& playerY);
样品输入:与scanf函数读而不划界用户
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
的很多缺点,一个贫穷的修复。数组大小必须在c
,s
和[
格式的每个指针参数之后传递。但是这个尺寸必须作为rsize_t
传递,这与size_t
相同,并且限制了最大值。通过1
显然是错误的,因为1
是int
和scanf_s
需要可变数量的参数,因此不会自动转换额外的参数。如果在体系结构上以神秘方式失败,其中int
和size_t
大小不同,例如64位窗口,linux和OS/X。
您可以通过提高编译器的警告级别来避免这样的细微问题。 gcc -Wall -Werror
或clang -Wall -Werror
是一个好的开始。永远不要忽视这些有用的警告,如果你不明白这些警告,你可能不知道你的代码真的在做什么。
除非scanf_s
是由您的编码规则或你的编译器规定的,它更容易使用scanf
,只是作为安全的格式如下:
if (scanf("%c%d", &playerX, &playerY) == 2) ...
'scanf_s( “%C%d”,&PlayerX的,1, &playerY);' – BLUEPIXY
这是什么'10'? –
如果您阅读例如[this'scanf'(and family)reference](http://en.cppreference.com/w/c/io/fscanf),您将看到“除[,c和n之外的所有转换说明符都会消耗并放弃所有在尝试解析输入之前引导空白字符“。这意味着没有分隔符是需要的,但'scanf'会自动处理空格(空格,换行符,制表符等)作为“分隔符”。 –