我如何使用fscanf捕获字符串?

时间:2013-11-25 03:57:29

标签: c string capture scanf

我有一个格式如下的文件

A New Day Has Come (Radio Remix); 239
Ten Days; 227
Goodbye's (The Saddest Word); 198
Prayer; 313
I Surrender; 271
At Last; 209
Sorry For Love; 301

我如何使用fscanf来获取字符串,以及分号后面的数字?我试过这个

for(track = 0; track < albums[size].num_tracks; ++track){

    fscanf(fileptr,"%s;%i",albums[size].tracks[track].name,albums[size].tracks[track].length);

    //print out the tracks
    printf("Track number %i : %s", track, &albums[size].tracks[track].name);
}

但是,当printf发生时,整个字符串不会被打印,而是像

那样
Track number 0 : A 
Track number 1 : New
Track number 2 : Day
etc...

正如您所看到的,代码是出于某种原因捕获单个单词,而不是半冒号之前的整个字符串。我会用哪个表达式来抓取整个字符串?编辑拼写

2 个答案:

答案 0 :(得分:4)

虽然fscanf可能不是在这种情况下使用的最佳函数,但是正式地仍然可以使用它来使用以下格式说明符来获取以;结尾的字符串

fscanf(fileptr, "%[^;];%i",
  albums[size].tracks[track].name,
  &albums[size].tracks[track].length);

这将要求输入文件遵守非常严格的格式要求。另请注意,如果您的albums[size].tracks[track].lengthint个对象,则&之前需要albums[size].tracks[track].length运算符。在%i中使用fscanf格式说明符时,它会将指针作为参数重新命名为int

此外,您的printf看起来不正确。它应该是

printf("Track number %i : %s", track, albums[size].tracks[track].name);

&之前的albums[size].tracks[track].name不应该在那里。

答案 1 :(得分:0)

您不应该fscanf用于格式化数据。您的数据格式不是以fscanf友好的方式格式化。你最好阅读整行,然后只搜索分号。