我一直在创建一个程序,要求用户输入一个char值,但是如果他们输入多个字符,它将移至下一个函数并中断程序。我添加了第二种方法,当输入多个输入时该方法将运行。
您的问题不是限制写入的字符数之一cInput
;格式说明符%1s
已经做到了。您的问题是在输入缓冲区中留下未处理的字符之一。如果后续输入无法处理它们,则需要从缓冲区中删除所有字符。例如,如果您将一个字母字符保留在then缓冲区中,但稍后使用读取%d
,该函数将立即返回(因为还隐含了一个换行符),但是该字符将保持缓冲状态,因为它不是十进制数。如果您从不清除缓冲区,此操作将无限期继续。
对于单个字符,可以检查该字符不是换行符,然后重复获取字符直到找到换行符,如下所示:
scanf("%c", &cInput ) ;
while( cInout != '\n' && getchar() != '\n' ) { } // flush buffered line
如果要确保用户只输入一个字符,则可以这样修改上面的内容:
scanf("%c", &cInput ) ; // Get a single character
if( cInput != '\n' && // If the input is not "empty",
getchar() != '\n' ) // but the first character entered was not
// immediately followed by a newline...
{
// Flush to the end of the entered line
while( getchar() != '\n' ) { }
// Invalidate the input to force retry
cInput = 0 ;
}
至少要缓冲一个字符-至少要换行。一个有效的答案将包含两个字符,其中一个cInput
和一个换行符。if(...)
上面的条件读取第二个字符(如果有)(使用的短路评估cInput
),并检查它是否是输入的结尾(换行符)。如果不是,它将读取所有缓冲的字符,然后使其无效cInput
("No-way\n"
例如,假设输入了该字符,则cinput
包含)'N'
。
对于数字输入,您只需读取字符,直到找到换行符:
scanf("%d", &nValue);
while( getchar() != '\n' ) { } // flush buffered line
如果结尾的非数字字符会使整个输入无效,则需要检查以下字符是否为换行符。
int converted = scanf("%d", &nValue);
if( converted == 0 || getchar() != '\n' )
{
valid_input = false ;
while( getchar() != '\n' ) { } // flush buffered line
}
请注意,还有其他可能的解决方案。这是我的首选解决方案。
当应用于您的函数(具有其他简化形式)时:
int intAskUser(void)
{
char cInput = 0 ;
while( cInput != 'N' && cInput != 'Y' )
{
printf("Do you want to enter a value? Y or N\n");
scanf("%c", &cInput ) ;
if( cInput != '\n' && getchar() != '\n' )
{
while( getchar() != '\n' ) { } // flush buffered line
cInput = 0 ;
}
else
{
cInput = toupper(cInput) ;
}
}
// Return answer code 0 to 1
return (cInput == 'N') ? 0 : 1 ;
}
int getValue(int nLower, int nUpper)
{
assert( nLower < nUpper ) ; // precondition check
int nValue = 0 ;
bool valid_input = false ;
while( !valid_input )
{
printf("Enter a value between %d and %d: ", nLower, nUpper ) ;
int converted = scanf("%d", &nValue);
if( converted == 0 || getchar() != '\n' )
{
valid_input = false ;
while( getchar() != '\n' ) { } // flush buffered line
}
valid_input = nValue >= nLower &&
nValue <= nUpper ;
if( !valid_input )
{
printf( "Please try again. " );
}
}
printf("Value: %d", nValue);
return nValue;
}
需要注意的是toupper()
需要ctype.h
被收录,并类型bool
需要stdbool.h
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句