2016-11-14 126 views
-3

我已经写了这个简单的程序,它应该计算由用户输入的数字的阶乘。程序应该要求用户停止或继续该程序以查找新数字的阶乘。做while循环与字符输入

由于大多数时间用户不注意CapsLock程序应该接受Y或Y作为回答。但是每次运行这个程序,即使我输入Y/Y,它都会被终止!

我用Google搜索,发现了这个问题可能是由于new line字符得到我的字符输入接受的话,我修改了scanf函数代码scanf("%c", &choice);scanf("%c ", &choice);,以适应新的行字符,但我的程序还是会被终止接受Y/Y作为输入后。

这是代码。请尽可能让我知道处理这些问题的最佳做法和方法以及所需的更正。

#include<stdio.h> 
#include"Disablewarning.h" // header file to disable s_secure warning in visual studio contains #pragma warning (disable : 4996) 

void main() { 
    int factorial=1;//Stores the factorial value 
    int i; //Counter 
    char choice;//stores user choice to continue or terminte the program 

     do {//Makes sure the loop isn't terminated until the user decides 
      do{ 
       printf("Enter the no whose factorial you want to calculate:\t"); 
       scanf("%d", &i); 
      } while (i<0); 

     if (i == 0) //calculates 0! 
      factorial = 1; 
     else {//Calculates factorial for No greater than 1; 
      while (i > 0) { 
       factorial = factorial*i; 
       i--; 
      } 
     } 

     printf("\nThe factorialof entered no is :\t%d", factorial);//prints the final result 

     printf("\nDo you want to continue (Y/N)?"); 
     scanf("%c ", &choice); 

    } while (choice =="y" || choice =="Y"); // Checks if user wants to continue 

} 

我在编程初学者,我在Visual Studio中运行该代码2015

+4

' } while(choice ==“y”||选择==“Y”);' - >'} while(choice =='y'|| choice =='Y');' –

+1

'“Y”'是指向'char'的指针,但是'Y ''仅仅是'char'。 – ForceBru

+0

@Biffen它在推荐。我应该删除标签吗? –

回答

3

只需修改您的scanf类似以下内容:

printf("\nDo you want to continue (Y/N)? "); 
scanf(" %c", &choice); //You should add the space before %c, not after 

也应该使用:

} while (choice == 'y' || choice == 'Y'); // Checks if user wants to continue 

注: 简单报价'用于字符和双引号"用于字符串

+0

谢谢!它按预期工作:)请让我知道为什么这个工作,但不是以前的''%c“',并指出我可以阅读更多关于此行为的文章/链接。如果可能的话,请让我知道处理这种情况的最佳技术和方法。再一次感谢你 。 –

+1

在这种情况下,您可以使用'scanf'使用简单的'printf()'检查输入值“ – developer

2

你倒数第二行有一个字符串"y",这应该是一个字符文字即'y'

} while (choice =="y" || choice =="Y"); 

这应该是:

} while (choice =='y' || choice =='Y'); 

另外,你的scanf()不会消耗空白。 %c前添加一个空格,使其忽略换行符或其他空间:

scanf(" %c", &choice); 
+0

@George尽管答案依然如此。 – Biffen

+0

见上面我做了改变它为我工作现在增加%c后的空间如下 scanf(“%c”,&choice); – pravakar

0

尝试做的,即使修正后仍存在一些bug的代码如下
在你的代码,如果你输入“Y”,并重新计算阶乘它给出错误的答案,因为

int factorial is already loaded with the previous value

#include "stdafx.h" 
#include <stdio.h> 
#include <iostream> 

using namespace System; 
using namespace std; 

int calculateFactorial(int i); 

int main() 
{ 
    int i; 
    char choice; 

    do{ 
     printf("Enter the no whose factorial you want to calculate:\t"); 
     scanf("%d", &i); 
     printf("\n The factorial of entered no is :\t %d", calculateFactorial(i)); 
     printf("\n Do you want to continue (Y/N)?"); 
     scanf(" %c", &choice); 
    } while (choice == 'y' || choice == 'Y'); 
    return 0; 
} 

int calculateFactorial(int i) { 
    int factorial = 1; 
    if (i == 0){ 
     factorial = 1; 
    }else { 
     while (i > 0){ 
      factorial = factorial*i; 
      i--; 
     } 
    } 
    return factorial; 
} 
+0

”我是编程的初学者,我在visual studio 2015中运行此代码“。我没有阅读函数调用部分。谢谢,不过。 –

+1

没问题,如果你现在不想使用函数,因为你是初学者,所以你重置变量int factorial在do {factorial = 1; } while(---) –

+0

Yaa !!一旦循环开始按预期工作,我就做出了修正! :) –