2016-09-11 100 views
1

因此,我正在爲我的C程序使用視覺工作室。在while循環中使用「continue」,跳過scanf(「%d」,var)

while循環以提示符和scanf開頭,如果用戶輸入非數字響應,則循環中的開關/情況將變爲默認值。這會打印一個錯誤並「繼續」循環。

問題是,當循環繼續下一次迭代時,它會完全跳過「scanf」,然後通過默認情況無限循環。我搜索了幾個小時,但似乎無法找到解決方案。

我的目標是跳過開關/大小寫後的代碼,然後回到開頭。任何幫助將非常感激。

while (userInput != 'N' && userInput != 'n') { 

    printf("Enter input coefficients a, b and c: "); // prompt user input 
    scanf_s("%d %d %d", &a, &b, &c); // look for and store user input 

    /* ----- Break up the quadratic formula into parts -----*/ 

    inSqRoot = (pow(b, 2) - (4.0 * a * c)); // b^2 - 4ac 
    absInSqRoot = abs((pow(b, 2) - (4.0 * a * c))); // absolute value of b^2 - 4ac 
    denom = 2.0 * a; // get denomiator 2.0 * a 
    negB = -1.0 * b; // take negative of b 

    /*------ Determine number of roots -------*/ 

    if (!isdigit(a) || !isdigit(b) || !isdigit(c)) { 

     rootNum = 4; 

    } // end if 

    else if (a == 0 && b == 0 && c == 0) { 

     rootNum = 0; 
    } // end if 

    else if (inSqRoot == 0) { 

     rootNum = 1; 
    } // end if 

    else if (inSqRoot > 0) { 

     rootNum = 2; 
    } // end if 

    else if (inSqRoot < 0) { 

     rootNum = 3; 

    } // end if 


    /*------ Begin switch case for rootNum ------*/ 

    switch (rootNum) { 

    case 0: // no roots 

     printf("The equation has no roots.\n"); 
     break; 

    case 1: // one root 

     root1 = (-b + sqrt(inSqRoot))/denom; 

     printf("The equation has one real root.\n"); 
     printf("The root is: %.4g\n", root1); 
     break; 

    case 2: // two roots 

     root1 = (-b + sqrt(inSqRoot))/denom; 
     root2 = (-b - sqrt(inSqRoot))/denom; 

     printf("The equation has two real roots.\n"); 
     printf("The roots are: %.4g and %.4g\n", root1, root2); 
     break; 

    case 3: // imaginary roots 

     printf("The equation has imaginary roots.\n"); 
     printf("The roots are: %.1g + %.4gi and %.1g - %.4gi \n", negB/denom, sqrt(absInSqRoot)/denom, negB/denom, sqrt(absInSqRoot)/denom); 
     break; 

    default: 
     printf("ERROR: The given values are not valid for a quadratic equation.\n"); 
     continue; 
    } 

    printf("Enter Y if you want to continue or N to stop the program: "); 
    scanf_s("%*c%c", &userInput); 
    printf("\n"); 
} 
+1

「繼續」表示「斷開當前執行並從開始啓動循環代碼」。所以它是循環的「短路」。另一方面,'break'將退出循環塊。在這裏,你可以簡單地跳過'conitinue',你的scanf_s將被執行。 – Antoniossss

+0

然而'case' statemets,'break'打破當前case'不是外部循環 – Antoniossss

+0

那麼我的目標是跳過開關案例後的代碼,如果默認情況下被激活。然後回到頂部並要求用戶重新輸入整數值。 – Abbie

回答

2

scanf實際上沒有被跳過,它只是反覆讀取相同的錯誤輸入。您可以使用scanf的返回值來查看讀取了多少個參數。在惡劣輸入的情況下,這將是小於3要刷新錯誤的輸入,你可以這樣調用

void flushInput() { 
    int c; 
    while ((c = getchar()) != '\n' && c != EOF); 
} 

的函數,在默認情況下添加到flushInput通話

default: 
    printf("ERROR: The given values are not valid for a quadratic equation.\n"); 
    flushInput(); 
    continue; 
+0

啊,你打敗了我!上面我正在等她回答我的評論。我沒有運行代碼,但如果我是一個投注人,我會提供很好的賠率,你的回答是正確的。如果操作任務顯示她反覆看到「輸入係數a,b和c:」,我就贊成你的答案! –

0

在涉及用戶輸入時,通常閱讀和驗證用戶輸入對編寫一個行爲良好的應用程序至關重要。用戶可能會提交不完美的輸入,並且您的應用程序應該檢查它。

scanf()的未必是最好的選擇,因爲它是一個蒸汽輸入,而不是控制檯輸入功能,不行爲以預期的方式:

  • 將空白和換行符相同
  • 只會返回如果所有變量都被讀取和分配,或遇到文件結束符(Ctrl + Z)。

所以我的建議是使用選擇的控制檯I/0函數來代替,這是gets()(或它的「安全」的形式gets_s())。這一行爲與所需的行爲相同,因爲它完全讀取整行文本,並在按下Enter鍵時返回(scanf()甚至可能從下一行讀取參數)。

然後使用sscanf(),它就像scanf(),但是從緩衝區中讀取變量,並返回讀取和分配的變量數量。您可以使用「%d%d & d%s」作爲格式字符串,以檢查用戶是否輸入了正好3個變量,而不是更少或甚至更多(第四個變量將是一個虛擬字符串,使用只有當用戶提交亂碼輸入時sscanf()纔會返回3以上)。