2013-10-22 65 views
0

我想使用文件操作在C中的鏈表。我想獲得一條線,並將其拆分並存儲在結構中。但我不能分裂兩個字符串。在C中使用「fscanf」如何拆分兩個字符串?

我的文件是這樣的:

1#埃姆雷#多安
2#約翰#史密斯
3#阿什利#托馬斯
等等

我想讀取一行文件使用fscanf。

fscanf(file,"%d#%s#%s",&number,name,surmane); 

但結果是

數量:1
名稱:埃姆雷#多甘

如何可以在名稱中擺脫#元素,並把它分解到姓名;

+5

嘗試使用strtok()來解析輸入字符串 – Anand

+0

你也可以使用sscanf()函數。詳細的例子去這裏http://www.tutorialspoint.com/c_standard_library/c_function_sscanf.htm –

回答

5
#include <stdio.h> 
#include <string.h> 

int main(void) { 

    FILE *fptr; 
    fptr = fopen("Input.txt", "r"); 

    int number; 
    char *name; 
    char *surname; 
    char line_data[1024]; 

    fgets(line_data, 1024, fptr); 

    number = atoi(strtok(line_data, "#")); 
    name = strtok(NULL, "#"); 
    surname = strtok(NULL, "#");  

    printf("%d %s %s", number, name, surname); 
} 

輸出:

1 Emre Dogan 

編輯: Coverted變量 「數量」 從字符串到整數。

+0

謝謝@Anand ...那麼我怎麼能將這個「字符串」數字轉換爲int .. –

+0

@EmreDoğan使用'atoi' http: //www.cplusplus.com/reference/cstdlib/atoi/ – Sadique

+0

但是這個程序仍然顯示我只有最後一個名字和數字..並分裂它。編號:1 Emre DOGAN 2 Emre GAN 3 Emre N 4 Emre DOGN等。 –

0

最好用fgets()來讀完整行,然後解析該行。這更加穩健,直接在輸入流上使用fscanf()可能會造成混淆,因爲fscanf()會跳過空格。

所以,你可以這樣做:

char line[1024]; 

if(fgets(line, sizeof line, file) != NULL) 
{ 
    int age; 
    char name[256], surname[256]; 

    if(sscanf(line, "%d#%255[^#]#%255s", &age, name, surname) == 3) 
    { 
    printf("it seems %s %s is %d years old\n", name, surname, age); 
    } 
} 

它使用%[]格式說明,以避免包括在解析字符串#分離。我認爲這比strtok()更清潔,這是一個最好避免的可怕功能。

相關問題