2011-07-13 60 views
2

首先,我想先感謝大家。我非常期待在計算機科學領域取得進展,並在我變得更加精通時幫助其他人。我的代碼循環比我想要的多一次,我懷疑我的getchar語句有問題

現在,這裏是我的代碼:

#include <stdio.h> 
#include <stdlib.h> 

#define RECORDS 30 

/*Questions 
Formatting display() - can we use spaces to format? 
Is the patient structure supposed to be global or local in enter()? 
*/ 

void enter(); 
void display(); 
void update(); 
void loadDisk(); 
void writeDisk(); 
void emptyDisk(); 
void sort(); 
void clear(); 

struct patient 
{ 
    char * name; 
    int age; 
    double highBP, lowBP, riskFactor; 
}; 

struct patient * db[RECORDS]; 
int counter = 0; 

main() 
{ 
    int flag = 1; 

    while (flag == 1) 
    { 
     printf("---------------------------------------------------------\n"); 
     printf("|\t(N)ew record\t(D)isplay db\t(U)pdate record |\n"); 
     printf("|\t(L)oad disk\t(W)rite disk\t(E)mpty disk |\n"); 
     printf("|\t(S)ort db\t(C)lear db\t(Q)uit   |\n"); 
     printf("---------------------------------------------------------\n"); 
     printf("choose one: "); 

     char selection = getchar(); 

     printf("selection %c\n", selection); 

     if ((selection == 'n') || (selection == 'N')) 
     { 
     //New record 
     enter(); 
     } 

     else if ((selection == 'd') || (selection == 'D')) 
     { 
     //Display db 
     //printf("display %d\n", flag); 
     display(); 
     } 

     else if ((selection == 'u') || (selection == 'U')) 
     { 
     //Update db 
     update(); 
     } 

     else if ((selection == 'l') || (selection == 'L')) 
     { 
     //Load disk 
     loadDisk(); 
     } 

     else if ((selection == 'w') || (selection == 'W')) 
     { 
     //Write disk 
     writeDisk(); 
     } 

     else if ((selection == 'e') || (selection == 'E')) 
     { 
     //Empty disk 
     emptyDisk(); 
     } 

     else if ((selection == 's') || (selection == 'S')) 
     { 
     //Sort db 
     sort(); 
     } 

     else if ((selection == 'c') || (selection == 'C')) 
     { 
     //Clear db 
     clear(); 
     } 

     else if ((selection == 'q') || (selection == 'Q')) 
     { 
     //Quit 
     flag = 0; 
     } 

     else 
     { 
     printf("not a vaild input\n"); 
     } 
    } 
} 

void enter() 
{ 
    /*struct patient temp; 

    printf("name: "); sscanf("%s", temp.name); 
    printf("age: "); scanf("%d", temp.age); 
    printf("high bp: "); scanf("%f", temp.highBP); 
    printf("low bp: "); scanf("%f", temp.lowBP); 

    db[counter] = (struct patient *) calloc(1, sizeof(temp)); 
    *db[counter] = temp; 

    //printf("%s, %d, %f, %f", db[counter]->name, db[counter]->age, db[counter]->highBP, db[counter]->lowBP); 
    counter++;*/ 
} 

void display() 
{ 

} 

void update() 
{ 

} 

void loadDisk() 
{ 

} 

void writeDisk() 
{ 

} 
void emptyDisk() 
{ 

} 

void sort() 
{ 

} 

void clear() 
{ 

} 

我運行時遇到的問題是,菜單顯示後,我兩次輸入選項。我無法理解發生了什麼問題,但我懷疑它與存儲選擇和新行字符的getchar有關,因此運行它兩次。這也意味着最終的其他聲明將會運行,它會這樣做。

我想我已經對問題進行了三角分析,只是不確定如何解決它。先謝謝你!

+1

僅供參考:'getchar'返回一個'int',而不是'char'。在將其重新轉換爲char字符之前,必須首先對常量EOF進行測試,以確定是否已經達到了輸入的結尾(例如,在Unix-ish終端上控制-D,或者從結束管道中的輸入或重定向文件)。你應該像對待用戶輸入'q'一樣對待它。另外,C沒有'switch'語句? – derobert

回答

2

如果問題出現在getchar中,那麼它爲什麼不使用不同的函數?

嘗試更換:

char selection = getchar(); 

有了這個:

char selection; 
scanf("%c",&selection); 

如果你擔心在單個字符溢出,然後做一個scanf()函數的字符串,並且只使用第一在你的支票字符:

char selection, selectionstr[20]; 
scanf("%s",selectionstr); 
selection = selectionstr[0]; 
+0

我試過你的第一個解決方案,它沒有工作。同樣的問題。我現在在嘗試你的第二個。謝謝! – seyelent

+0

賓果!你的第二個工作!現在我試圖弄清楚爲什麼你的第一個沒有,因爲我之前嘗試過完全一樣的東西......再次感謝! – seyelent

+0

樂於幫助。我建議查看@derobert留在您的原始聲明中有關使用switch-case塊而不是一堆if-else語句的評論。 – Valdogg21

0

是的,問題是你的輸入總是一個字符串,至少有一個字符後跟一個換行符。我要麼改變你的循環,這樣如果選擇是'q',或者使用getchar以外的函數並修剪你的輸入,它就會終止。

+0

除了getchar以外的任何建議?謝謝! – seyelent

+0

我會嘗試scanf或它的堂兄弟之一。 – LeakyBucket

1

getchar還返回'\n'字符。

+0

謝謝!我猜想是造成這個問題的原因。 – seyelent

0

我想你可以用curses做到這一點! Here是一個您可能會覺得有用的網站。 Curses是c的遊標控制庫。

從手冊:

最初終端可以是或可以不是在CBREAK模式,作爲模式是 繼承;因此,程序應該調用cbreak或nocbreak來顯式地執行。大多數使用curses的交互式程序都會設置cbreak模式。 請注意cbreak覆蓋原始。

+0

嗯,我會看看。暫時,我必須做我的老師所要求的:)謝謝! – seyelent