2016-09-30 54 views
0

如何使用sscanf()分開輸入?這裏我有一個getline找到輸入。我之前檢查過輸入,它是正確的,這意味着如果您不結束文件,它可以讀取您輸入的一行。然後我試圖通過使用sscanf();來分隔您輸入的內容。我應該如何使用sscanf()將行分解爲字段?

  • 第一個字段是字符數組沒有長度限制
  • 第二字段是具有長度極限的字符數組
  • 第三個字段是一個整數

我想是,如果我輸入,例如:

bd_21 abs 124 32152 23415 

然後它會打印出bd_21 abs 124因爲我只sscanf前三個元素,並把它們放到我指定的字段中。但是,當我運行它,它顯示

段故障:11

我不知道什麼是錯在這裏。任何人都可以解釋如何使用sscanf來斷線?

我的代碼:

int main() { 
    char *input = NULL; 
    size_t len = 0; 
    char *field1 = NULL; 
    char field2[33]; 
    int field3; 
    while(getline(&input, &len, stdin) != EOF){ 
     //printf("%s", input); 
     sscanf(input, "%s %32s %d", field1, field2, &field3); 
     printf("%s %s %d\n", field1, field2, field3); 
    } 
    return 0; 
} 
+0

你的'sscanf'調用寫入一個'NULL'指針。沒有[scanf'家族成員](http://en.cppreference.com/w/c/io/fscanf)分配內存。 –

+2

您需要爲'field1'分配空間,或者您需要使用POSIX擴展名'%ms',並且傳遞'&field1',所以['sscanf()'](http://pubs.opengroup.org/onlinepubs /9699919799/functions/sscanf.html)爲您分配內存。 –

+0

談到分配內存,'getline'調用*會分配內存,你忘記了'free',所以你會有內存泄漏。除非重新初始化'input'和'len'變量,否則您將無法讀取更長的行。 –

回答

1

它會崩潰。爲field1分配內存。

char *field1 = NULL; 
+0

我知道分配內存的方式是使用calloc()或malloc()?但是如果我不'我不知道它的大小是多少,我應該如何爲它分配內存? – user1234567

+0

@ user1234567:第一個字段有多大?4個KiB足夠了嗎?還是你需要允許4個MiB?分配一個合適的大小,那麼你可以在之後重新分配到正確的大小,或者像我在主要問題的註釋中提到的那樣使用'%ms'。並非所有的POSIX-ish系統都支持'%ms' - 例如Mac OS X 10.11和更早的版本,似乎也不是macOS Sierra 10.12。 –

+0

@JonathanLeffler同意。:) –

相關問題