2015-11-02 80 views
1

你好,我的程序設計爲在文本文件中對記錄進行排序,但我的主要問題是獲取主要功能,詢問用戶是否想運行再次編程讀取和寫入另一個文件。我的程序現在,當用戶輸入1再次運行時,跳過第一個問題進入程序讀取。這是爲什麼?我感謝幫助!這裏只是我的主要功能:程序僅在第一次運行時編譯。C程序:Do-while循環再次運行程序無法正常工作

int main() 
{ 
    int fieldCount = 0; 
    int lineCount = 0; 
    char file[STR_LEN]; 
    char filepath[STR_LEN]; 
    char** fields = NULL; 
    char** lines = NULL; 
    int recCount = 0; 
    Person **sortedRecs = NULL; 
    int x; 

do { 
    printf("Enter path of the file to read: "); 
    gets(filepath); 
    printf("Enter path to copy to: "); 
    gets(file); 
    fields = readFieldsDynamic(filepath, &fieldCount); 
    lines = readLinesDynamic(filepath, &lineCount); 
    recCount = getPersons(fields, fieldCount, &sortedRecs); 
    if (recCount && lines && sortedRecs && (recCount <= lineCount)) { 
     writeRecsToFile(file, sortedRecs, recCount, lines, lineCount); 
     printf("Sorted records are written in %s\n", file); 
    } 
    if (fields) { 
     freePointerToChars(fields, fieldCount); 
    } 
    if (lines) { 
     freePointerToChars(lines, lineCount); 
    } 
    if (sortedRecs) { 
     freeRecs(sortedRecs, recCount); 
    } 
    printf("Enter 1 to run program again: "); 
    scanf("%d%*c", &x); 
    } while (x == 1); 
    return 0; 
} 
+0

我發佈的主要功能只是因爲我沒有東西的功能和結構有效果它正確循環 – Benny

+0

請參閱[這裏](http://stackoverflow.com/questions/5240789/scanf-leaves-the-new- line-char-in-buffer) –

+0

謝謝@ user3121023!它解決了我的問題! – Benny

回答

0

你可以做的就是添加一個while循環來「吃掉」在stdin流離開以避免在未來getchar不真正的用戶輸入塊的所有換行符。

while ((ch=getchar()) != EOF && ch != '\n') 
    ; 

此外請不要在您的代碼中使用gets。改爲嘗試fgets

0

這個答案是根據你的輸出看起來像:

Enter path of the file to read: /my/input/here/ 
Enter path to copy to: /blah/copy/here/ 
Enter 1 to run program again: 1 
Enter path of the file to read: 
Enter path to copy to: help/I/cant/type/in/the/above/field 

我的理解是你的程序可能是結轉環之間的換行。

我在C++中遇到了類似的問題,並且在輸入修正後將cin.get()置爲0。我不確定C等價物。