2012-12-02 90 views
2

我寫了一個函數,它讀取一個未知長度的字符串,直到Enter被按下並返回一個字符指針。當我從開關櫃內調用該功能時,它不會等待我的輸入。爲什麼我的功能不等待輸入?

char *get_paths() 
{ 
    unsigned int length_max = 256; /*Initial length of string*/ 
    unsigned int current_size; 
    current_size = length_max; 

    /* Allocating memory for string input */ 
    char *tmpStr = malloc(length_max); 

    /* Simple check to make sure our pointer is not NULL */ 
    if(tmpStr != NULL) 
    { 
     int c = EOF; 
     unsigned int i = 0; 

     printf("Enter The EXACT or RELATIVE File Paths Separated by a Space: "); 

     /* Accept input until Enter key is pressed or user inserts EOF */ 
     while((c = getchar()) != '\n' && c != EOF) 
     { 
      tmpStr[i] = (char)c; 
      ++i; 

      /* If memory is filled up, reallocate memory with bigger size */ 
      if(i == current_size) 
      { 
       current_size = i + length_max; 
       /* realloc does magic */ 
       tmpStr = realloc(tmpStr, current_size); 
      } 
     } 

     /* A valid string always end with a '\0' */ 
     tmpStr[i] = '\0'; 
     printf("Got it: %s \n", tmpStr); /*TODO: REMOVE;; USED FOR TESTING*/ 
     return tmpStr; 
    } 
} 

開關殼體(I有一個char * PTR = NULL出開關塊):

/*File input*/ 
case 1: 
    ptr = get_filepaths(); 
break; 

輸出:

輸入確切或RELATIVE文件路徑分隔的空間:明白了:

+0

哪裏是你的交換機的情況下 –

+0

好你的註釋你的代碼,但是你的一些評論是非常多餘的,比如「簡單的檢查,以確保我們的指針不爲NULL」是顯著長於'如果(tmpStr! = NULL)',並且它沒有解釋代碼沒有解釋的任何東西。 – dreamlax

回答

-1

我能夠找到'解決辦法'的解決方案就是在第一個printf()調用後面添加一個getchar()不知道爲什麼這個工程!

+0

你可能有一個'scanf()'的地方留下換行符([閱讀此](http://c-faq.com/stdio/scanfinterlace.html))。你應該在那裏清理,而不是在'get_paths()'函數內部清理。 – potrzebie

2

你很可能遇到stdout緩衝問題,這是printf的默認設置。您需要明確清空stdout或在您的第一個printf語句末尾放置一個換行符以強制緩衝區刷新。由於在「Got it」語句末尾有一個換行符,會發生什麼情況是兩個語句(第一個語句被緩衝)會同時輸出到輸出,因爲第二個語句會強制刷新緩衝區。

另一種可能性是,有可能已在stdin未讀數據,當你調用在while -loop getchar(),它讀取以前的緩存數據,打一個換行符,然後退出循環,而不是讓你來輸入新的信息。爲了避免這個問題,請執行如scanf("%*[^\n]%*c");這樣的操作,以便將輸入消耗到輸入中已經存在的下一個換行符(包括換行符本身),而不用擔心緩衝區溢出。

+0

在第一次printf調用後添加fflush(stdout),不起作用。添加\ n到printf,沒有工作。 :( – Nima

+0

你在調用'getchar()'之前清除了輸入嗎?換句話說,可能在'stdin'上有一些其他的輸入正在被讀取嗎? – Jason

+0

以及我用scanf在另一個函數中讀取用戶輸入的順序使用開關,我試着在調用getchar()之前添加'fflush(stdin)',但仍然跳過輸入。 – Nima