2016-11-14 116 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 !!一旦循環開始按預期工作,我就做出了修正! :) –