2013-10-22 91 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()更清洁,这是一个最好避免的可怕功能。

相关问题