2013-08-04 147 views
2

我正在處理一組處理字母集的C程序。但是,我遇到了一個問題。由於某種原因,該代碼一次打印兩次消息Enter next element of Set A,因此它不會要求輸入兩者中的第一行。處理集問題的C程序

例如:

If the size of Set A is 5, the program will print: 

Enter first element of Set A:(user inputs f) 

Enter next element of Set A:(doesn't allow user to input value) <--printed at same time with line below 
Enter next element of Set A:(allows a user input) 

Enter next element of Set A:(doesn't allow user to input value) <--printed at same time with line below 
Enter next element of Set A:(allows a user input) 

下面是代碼:

void getSetA(bool setA[], int sizeA) 
{ 
     letters element, letter; 
     int position = 0, num; 

     printf("\nEnter the first element in Set A: "); 
     element = getchar(); 
     for(letter = a; letter <= z; letter++) 
     { 
       if(element == letter)  setA[position + 1] = true; 
       else      position++;   
     } 
     for(num = 1; num <= sizeA -1; num++) 
     { 
       printf("\nEnter next element of Set A: "); 
       element = getchar(); 
       for(letter = a; letter <= z; letter++) 
       { 
          if(element == letter)  setA[position + 1] = true; 
          else      position++;   
       } 
     } 
} 

注意,類型的信是由我爲字母表中的所有字母定義,且組A是布爾類型的數組。 sizeA是他以前輸入的Set A的大小。

預先感謝您。

+0

這似乎是你的緩衝區恨你,你有沒有嘗試過插入一個空的getchar? – Fenixp

+0

你的代碼非常多餘。 – Jori

回答

1

您遇到的問題是getchar()只能從輸入緩衝區中抓取單個字符。這將是罰款,但還是有一個換行符在起因於打你輸入後,「ENTER」鍵輸入緩衝區離開..你需要清除輸入緩衝區使用getchar()後是這樣的:

char c; 
while ((c = getchar()) != '\n' && c != EOF);// the second part is only if you are working with files 
+0

謝謝,當我回家時我會試試這個 –

1

的原因是您的代碼似乎跳過每隔一行getchar會返回所有字符,包括行尾標記。爲了解決這個問題,寫你自己的函數,它包裝getchar,並跳過所有\n\r人物有:

int getcharNoBreaks() { 
    int ret; 
    do { 
     ret = getchar(); 
    } while (ret == '\n' || ret == '\r'); 
    return ret; 
} 

getSetA之前將getcharNoBreaks或它的原型,並與getcharNoBreaks電話解決眼前取代getchar所有呼叫問題。

但是,代碼重複的一個更大的問題仍然存在:您的代碼會重複自身,這絕不是一個好主意。考慮將for循環切換爲do/while,這與我在getcharNoBreaks中使用的類型相同,以達到通過在循環之前放置另一個代碼副本來達到的效果。

最後,沒有通過所有字母迭代,看是否element是他們中的一個點:你可以用一個if更換整個循環:

if (element >= 'a' && element <= 'z') { 
    set[element-'a'] = true; 
} 
+0

謝謝你的建議,我會在我回家後試試這個,如果我有問題,我會問你 –