2015-04-06 52 views
0

样品输入:与scanf函数读而不划界用户

A10 

试图在这一输入

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

是否从用户输入需要阅读要划界?可以这样读吗?

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

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

+0

'scanf_s( “%C%d”,&PlayerX的,1, &playerY);' – BLUEPIXY

+1

这是什么'10'? –

+0

如果您阅读例如[this'scanf'(and family)reference](http://en.cppreference.com/w/c/io/fscanf),您将看到“除[,c和n之外的所有转换说明符都会消耗并放弃所有在尝试解析输入之前引导空白字符“。这意味着没有分隔符是需要的,但'scanf'会自动处理空格(空格,换行符,制表符等)作为“分隔符”。 –

回答

1

使用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_sscanf的很多缺点,一个贫穷的修复。数组大小必须在cs[格式的每个指针参数之后传递。但是这个尺寸必须作为rsize_t传递,这与size_t相同,并且限制了最大值。通过1显然是错误的,因为1intscanf_s需要可变数量的参数,因此不会自动转换额外的参数。如果在体系结构上以神秘方式失败,其中intsize_t大小不同,例如64位窗口,linux和OS/X。

您可以通过提高编译器的警告级别来避免这样的细微问题。 gcc -Wall -Werrorclang -Wall -Werror是一个好的开始。永远不要忽视这些有用的警告,如果你不明白这些警告,你可能不知道你的代码真的在做什么。

除非scanf_s是由您的编码规则或你的编译器规定的,它更容易使用scanf,只是作为安全的格式如下:

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

LSNED:'sizeof(size_t)== sizeof(rsize_t)'。 +1 – chux

+1

@chux:感谢您提供一个自我介绍的缩写词:今天,我了解到LSNED的意思是*每天学习新的东西*。我最喜欢的格言之一。 – chqrlie

+0

C11的安的问题之一。 K是包含'scanf_s()'在内的许多函数都不同于它们的MS对应函数。 MS的'scanf_s()'的实现需要'unsigned int'而不是'rsize_t'。 – cremno