我有一个变量int number
,我需要的代码只允许在变量中引入1,2,3,4或5。
我有scanf
而我只是做一个if...else
来检查这个数字是否在1到5之间,但重点是我不知道如果我介绍一个角色该怎么办,例如'Q'。我的意思是,我希望程序说“这是一个角色,而不是一个数字。”
答案 0 :(得分:1)
在缓冲区上使用sscanf(或者在下面的示例中,使用argv程序参数)来尝试查找数字,然后查找字符。 sscanf的返回码是:
...the number of input items successfully matched and assigned, which can be fewer than provided for, or even zero in the event of an early matching failure.
这是一个示例程序
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main(int argc, char ** argv){
int val=-1;
char other;
int code;
if (argc !=2 ) {
printf("please give an arg to program\n");
exit(0);
}
code=sscanf(argv[1],"%d",&val);
if (code == 1) {
printf( "number %d", val);
}
else {
code=sscanf(argv[1],"%c",&other);
if (code == 1) {
printf("character is %c", other);
}
else {
printf("error occured");
}
}
}
答案 1 :(得分:1)
仅接受1到5的输入,包括:
#include <stdio.h>
int main() {
int rc, answer = 0;
printf("A number between 1 and 5: ");
rc = scanf("%i", &answer);
if(rc == EOF || rc == 0 || answer > 5 || answer <= 0) {
fprintf(stderr, "Only numbers between 1 and 5, please.\n");
return -99;
} else {
printf("You entered: %d\n", answer);
return 0;
}
}
答案 2 :(得分:0)
返回值
这些函数返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。
如果在第一次成功转换或匹配失败发生之前达到输入结束,则返回值EOF。如果发生读取错误,也会返回EOF,在这种情况下,将设置流的错误指示符(请参阅ferror(3)),并设置errno指示错误。
基本上,scanf
将继续扫描,直到匹配或失败。一个示例程序是这样的:
#include <stdio.h>
int main() {
int number, result;
result = scanf("%i", &number);
if(result == EOF) {
// an error occured.
fprintf(stderr, "That's not a number");
} else {
// logic! yay!
// the result is in `number`.
}
}
使用man scanf
获取更多信息。
答案 3 :(得分:0)
尝试使用此代码:
#include <stdio.h>
int clearStdin()
{
while (getchar() != '\n');
return 1;
}
int main()
{
int integer = 0;
char character;
printf("Enter an integer not a character:\n");
do
{
printf("? ");
} while (((scanf("%d%c", &integer, &character) != 2) || (character != '\n')) && clearStdin());
printf("You entered the following integer: %d\n", integer);
return 0;
}
答案 4 :(得分:0)
scanf
将返回成功转换和分配的次数,因此您可以检查以确保至少读取1位数字符:
int value;
...
if ( scanf( "%d", &value ) == 1 )
{
// read at least 1 digit
}
else
{
// first character was not whitespace or a digit
}
这是什么“阅读至少1位数”的废话? %d
转换说明符告诉scanf
跳过任何前导空格,然后读取并转换十进制数字,直到找到一个非数字字符。这意味着如果您键入"12w4"
之类的字符串,scanf
将转换并将12
分配给value
,请返回1,并在输入流中保留"w4"
下次阅读犯规。
这可能不是你想要的行为。您可以扫描以下非数字字符,如下所示:
#include <ctype.h>
...
int value;
char follow;
...
if ( scanf( "%d%c", &value, &follow ) == 2 )
{
if ( !isspace( follow ))
{
fprintf( stderr, "detected non-digit character in input\n" );
}
}
else
{
// first character was not whitespace or a digit
}
你已经抓住了这个案子,但你的输入现在可能处于不良状态;你怎么知道下一个角色是否是输入错误的一部分? IOW,你怎么知道输入是12w4
而不是12w 4
?
就个人而言,我采取了不同的方法。我将输入作为字符串读取,然后使用strtol
执行转换:
/**
* Assuming a 64-bit integer value, average 3.2 bits per decimal digit, we
* need to store up to 22 digits plus an optional sign character plus the 0
* terminator
*/
define INPUT_SIZE 24
...
char input[INPUT_SIZE] = {0};
long value = 0;
...
if ( fgets( input, sizeof input, stdin ))
{
char *newline = strchr( input, '\n' );
if ( !newline )
{
fprintf( stderr, "Input is too long for a 64-bit integer...rejecting\n" );
/**
* Cycle through the input stream until we see the newline character
*/
while ( fgets( input, sizeof input, stdin ) && !strchr( input, '\n' ))
;
}
else
{
char *chk; // will point to the first character that's *not*
// part of a decimal integer
long temp = strtol( input, &chk, 10 );
if ( !isspace( *chk ) && *chk != 0 )
{
fprintf( stderr, "%s is not a valid integer input\n", input );
}
else
{
value = temp;
}
}
}
这使我能够捕获输入值显然太长而无法存储在目标数据类型中的情况,scanf
它还允许我捕获输入中间非数字字符胖指的情况,并完全拒绝整个输入,{em> else scanf
不保护您。
答案 5 :(得分:0)
简单阅读1 char
并测试它。
int ch;
while ((ch = fgetc(stdin)) != EOF) {
if ((ch < '1') || (ch > '5')) {
fputs(stdout, "That's a not number 1 to 5.\n");
}
else {
ch -= '0';
printf("Good: %d entered\n", ch);
}
}