2013-07-03 142 views
1

如何在一個循環中讀取多個字符串,每個字符串的長度都不是先前已知的?我嘗試了以下,但它不按需要工作。讀取長度未知的字符串

int main() 
{ 
    int j, i = 0; 
    char c; 
    char *buf = malloc(20); 
    size = 20; 
    for(j = 0; j < 10; j++) 
    { 
     i = 0; 
     while(1) 
     { 
      if(i == size) 
      { 
       buf = realloc(buf,size+10); 
       size += 10; 
      }    

      char c = getchar(); 

      if(c == '\n') 
       break; 

      buf[i] = c; 
      i++;   
     } 
     buf[i] = '\0'; 
     printf("%s\n", buf); 
    } 
} 

它只有在我將這些字符串作爲輸入時纔有效。但是假設我有一個scanf(「%d」,& j),在我輸入字符串輸入之前,然後按這個scanf的輸入將使我的第一個字符串爲空

+0

那如何不工作?它一次只讀取一個字符,不管它是否是數字字符都無關緊要。 –

+0

@ugoren是的,我做的。仔細閱讀代碼 – ishan3243

+0

@JoachimPileborg 它只適用於我將這些字符串作爲輸入。但是,假設我有一個scanf(「%d」,&j)之前,我採取字符串輸入,然後按這個scanf輸入將使我的第一個字符串爲空。 – ishan3243

回答

2

使用例如scanf之前,你在問題中的方式閱讀你的字符串,是scanf調用離開在輸入緩衝區中的換行符。所以getchar取得的第一個字符是這個換行符,導致你的第一行是空的。

您可以通過兩種方式解決這個問題:

  • 告訴scanf使用

    scanf("%d ", &i); 
    

    公告格式代碼後面的空格放棄任何尾隨空白。

  • 手動跳過空白:

    int c; 
    while ((c = fgetc(stdin)) != EOF && isspace(c)) 
        ; 
    /* `c` is now a non-space character or EOF, put it back if it's not EOF */ 
    if (c != EOF) 
        ungetc(c, stdin); 
    
+0

遐我知道....我的問題是如何克服這個 – ishan3243

+0

@ user2545792你快速評論,再次檢查我的答案:) –

+0

非常感謝你的幫助! – ishan3243

相關問題