2015-10-19 41 views
-1

我做了包含一些函數的ac源文件'functions.c',頭文件'functions.h'包含函數和一個'main.c'源文件。現在我使用main來調用functions.c中的函數,使用functions.h中的原型。下面是'functions.c'文件中的一個函數。gets()不要求輸入,除非在它之前使用getchar()或另一個gets()

我的代碼:

#include "functions.h" 
#include <stdio.h> 
#include <string.h> 

void func1(void) 
{ 
    int i, j, k, l; 
    char string[25]; 
    printf("Enter any valid 10 digit mobile number\n"); 
    here: 
    //getchar(); 
    gets(string); 

    j = k = 0; 
    for (i = 0; string[i] != '\0';) 
    { 
    if (string[i] <= 57 && string[i] >= 48) 
     i++; 
    else if (string[i] == 45 || string[i] == 46 || string[i] == 47 || string[i] == 42 || string[i] == 95 || string[i] == 124 || string[i] == 58 || string[i] == 92 || string[i] == 59 || string[i] == 0) 
    { 
     i++; 
     k++; 
    } //some special characters allowed 
    else 
    { 
     printf("%c is not a valid digit or symbol for a mobile number\n", string[i]); 
     j++; 
     i++; 
    } 
    } 
    if ((i - k) == 10 && j == 0) 
    printf("Mobile number is valid\n"); 
    if ((i - k) != 10 || j != 0) 
    { 
    printf("Mobile number is invalid\nEnter 1 to try again or 2 to exit\n"); 
    scanf("%d", &l); 
    if (l == 1) 
    { 
     printf("Enter mobile number again\n"); 
     goto here; 
    } 
    else if (l == 2) 
     printf("Program Terminating\n"); 
    else 
     printf("You didn't enter either of 1 or 2\nProgram Terminating\n"); 
    } 
} 

現在我的問題是 -

1 「?爲什麼得到()不工作爲什麼得到()不要求任何輸入」 2「爲什麼當我在代碼中包含getchar()時,它會開始詢問輸入?我的意思是當我從getchar()中刪除註釋符號?」

我是一個新手..所以請去軟..謝謝你的答案。

+0

該問題將由於未定義的行爲(UB)由您的代碼的其他部分調用。請發佈您的代碼 – amdixon

+0

請嘗試創建[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve),並編輯您的問題以包含該問題。還包括輸入和實際以及預期的輸出。 –

+2

另外,不要使用'gets',這是危險的,自C99標準以來已被棄用,並且在C11標準中被實際刪除。 –

回答

2

的問題是你的混合使用scanfgets:當您使用scanf讀取數,換行符用戶按下會在輸入緩衝區和scanf調用不會將其刪除。但是,當您循環回呼gets(順便說一下,不要使用標籤和goto循環!)gets調用讀取該換行符並將其視爲空行。

scanf之後,您應該閱讀循環中的字符,直到您閱讀換行符。


重要提示:您可能會看到使用fflush(stdin)要「刷」的輸入緩衝區某些地方(即丟棄所有(含)的新行)。根據C規範,這在技術上是未定義的行爲。有些環境將其作爲擴展,但如果您想要正確和便攜,則不應使用它。

+0

我明白你說的情況,當命令通過'goto'返回到上面的情況時,但第一次執行'gets'時的情況如何,即在它之前沒有使用'scanf'呢?在這種情況下'stdin'沒有換行符? –

+0

@PrabhavPandya如果你在調用'gets'之前沒有做任何輸入,那麼它應該按預期工作。但是你的代碼是在一個單獨的函數中,我們不知道你在調用這個函數之前做了什麼,比如在那裏也使用'scanf'? –

+0

好吧..我明白了..非常感謝。 –

0

gets(string)從標準輸入緩衝區stdin中讀取。如果您在程序中的任何其他位置使用scanf(),用戶按下以提交scanf輸入的換行符('\n')仍將位於stdin中,除非您手動清除它。然後gets(string)將解釋爲空行。

你的溶液或者不使混合使用scanfgetsscanf或類似功能的每次調用後手工清除輸入緩衝器stdin

相關問題