4

我在使用 C 中的嵌套条件运算符时遇到了一些麻烦。

int is_correct() {

  char YN ;

  printf( "Y or N : " ) ;
  scanf( "%c", &YN ) ;
  YN = toupper( YN ) ;

  return ( YN == 'Y' )? 1 : ( YN == 'N' )? 0 : is_correct() ;
}     

我的印象是,如果输入了“Y”或“N”,最后一行代码将返回 1 或 0,或者如果输入了意外字符,则再次调用自身。相反,无论输入如何,它都会不断地调用自己。

4

3 回答 3

2

可能扫描失败,您没有验证它。

您没有指定“连续”是否意味着“不停止阅读更多输入”,它当然应该这样做。

请注意,例如,toupper()使用int-typed 参数和结果,并且期望类型的值unsigned char可能会在那里遇到未定义的行为。

这是ctype.h函数的一个非常令人困惑的方面。unsigned char如果数据来自文本 ( char) 缓冲区,我倾向于在调用中强制转换。

添加printf()调用以打印出YN最后一行之前的值。

于 2013-06-29T20:12:33.850 回答
1

%c转换不会读取您必须在单字符答案后键入的换行符。

一般来说,scanf()导致的问题远远多于它的价值。尝试使用getline()从字符串中读取stdin字符串,然后使用sscanf()从字符串中提取字符。

除其他外,getline()允许您指定最大输入长度,因此您可以轻松避免溢出字符串缓冲区。

于 2013-06-29T21:03:45.887 回答
0

scanf("%c",&YN)转换说明符之前放置一个空格,%c就像scanf(" %c",&YN)吃掉换行符(\n

#include <stdio.h>
#include <ctype.h>

int is_correct(void) 
{
   char YN ;
   printf( "Y or N : " ) ;
   scanf(" %c",&YN);
   YN = toupper( YN );

   return  YN == 'Y' ? 1 :  YN == 'N' ? 0 : is_correct() ;
}     

int main()
{ 
    printf("%d",is_correct());
    return 0;
}

我已经测试过了。如果您只输入一个字符(不包括\n),工作正常!
以更有效的方式,您可以这样做;将第一个字符存储到char ch然后使用循环while((YN = getchar()) != '\n')来吃掉所有其他字符,包括\n. 例如:如果您键入ynabcd,第一个字符y将存储在chas 中,其余字符将被循环 Y吃掉。while(

int is_correct(void) 
{
   char YN ;
   printf( "Y or N : " ) ;
   scanf("%c",&YN);
   char ch = toupper( YN );
   while((YN = getchar()) != '\n')
    ; 
   return  ch == 'Y' ? 1 :  ch == 'N' ? 0 : is_correct() ;
}   
于 2013-06-29T21:18:03.537 回答