所以我在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
我似乎无法弄清楚为什么会这样做。我希望它在名字的第一个分隔符商店停止,然后读取;
并停在那里寻找名称变量,但显然这不是真的。任何有关它为什么会这样做的帮助将不胜感激。
答案 0 :(得分:2)
问题在于您正在将25个字符读入name
,将30个字符读入address1
和address2
。由于这是这些缓冲区的大小,因此没有剩余空间来终止空值。当您打印出name
字段时,打印不会在该缓冲区的末尾停止,并打印以下两个。
尝试将1添加到这些缓冲区的大小。在读取指定数量的字符后,scanf
函数将自动插入空字符。