带分隔符的fscanf在C中无法正常工作

时间:2014-10-27 01:39:21

标签: c scanf

所以我在fscanf和使用分隔符方面遇到了一些问题。

#include <stdio.h>

typedef struct 
    { short int custID;
      char name[25];
      char address1[30];
      char address2[30];
      short int numBikes;
      char bikeType;
      char cusRisk;
} CUSTOMER;

int main(void){
short int i = 0,j,ID;
double total = 0;
char exit;
char c;

FILE *input;
FILE *output;
input = fopen("input.txt","r");
output = fopen("output.txt","w");

// Allow up to 25 orders to be placed at once
CUSTOMER order[25];
system("clear");


// THIS IS WHERE I'M HAVING ISSUES
while((fscanf(input, "%hd %25[^;]; %30[^;]; %30[^;]; %hd %c %c",&order[i].custID, order[i].name, order[i].address1, order[i].address2, &order[i].numBikes, &order[i].bikeType, &order[i].cusRisk) == 7)){
    printf("Name: %s\n",order[i].name);
    printf("Address1: %s\n",order[i].address1);
    printf("Address2: %s\n",order[i].address2);
    printf("NumBikes: %hd\n",order[i].numBikes);
    printf("BikeType: %c\n",order[i].bikeType);
    printf("cusRisk: %c\n",order[i].cusRisk);
    i++;
}   

fclose(input);

return 0;
}

这是input.txt

的示例
1111 John Smith               ;320  E. Oak                   ;Warrensburg MO 64093          ;2 M Y 

我的问题是它在name变量中存储了name,address1和address2 all。然后它将address1和address2存储在address1变量中。最后,它将address2存储在address2中,就像预期的那样。所以输出将是这样的:

Name: John Smith         320 E. Oak           Warrensburg MO 64093
Address1: 320 E. Oak           Warrensburg MO 64093
Address2: Warrensburg MO 64093

我似乎无法弄清楚为什么会这样做。我希望它在名字的第一个分隔符商店停止,然后读取;并停在那里寻找名称变量,但显然这不是真的。任何有关它为什么会这样做的帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

问题在于您正在将25个字符读入name,将30个字符读入address1address2。由于这是这些缓冲区的大小,因此没有剩余空间来终止空值。当您打印出name字段时,打印不会在该缓冲区的末尾停止,并打印以下两个。

尝试将1添加到这些缓冲区的大小。在读取指定数量的字符后,scanf函数将自动插入空字符。