Ç如何使用sscanf的正确支持
目前我正在学习C. 从文件中读取反正切正题:Ç如何使用sscanf的正确支持
文本文件的内容:
123456 James Doakes; 0
987987 Dexter Morgan; 0
010203 Masuka Perv; 0
int main()
{
char accountNr[ACCOUNTNRSIZE], ownerName[NAMESIZE], enter[3];
int accountBalance = 0;
char filename[] = "breg.txt";
FILE *file = fopen(filename, "r");
if (file != NULL) {
char line[128];
while (fgets(line, sizeof(line), file) != NULL) {
sscanf(line, "%s %[^;] %d ", accountNr, ownerName, &accountBalance);
printf("%s", ownerName);
//fflushstdin();
}
fclose(file);
} else {
perror(filename);
}
return 0;
}
我写这个来检查例如James Doakes的名字是否正确注册:
printf("%s", ownerName);
但是,当它打印出来就像标准输出仍然是活动的,我可以推动回车,它会再次输入名称。我的目标当然是能够将数字,全名和最后一个数字作为单独变量进行扫描。但它显然不起作用。我猜测\ n也会被注册。不知道,我只是在猜测。
我在做什么错?为什么?我该如何解决这个问题?
非常感谢, 米夫
%s %[^;] %d
指由空格,可选空格中,不是;
,可选空格,那么号码的字符序列所终止的字符串。
你似乎是不扫描实际;
人物本身,这样,当你尝试获得号,的;
输入流中会导致失败。
#include <stdio.h>
#define ACCOUNTNRSIZE 100
#define NAMESIZE 100
int main (void) {
char accountNr[ACCOUNTNRSIZE], ownerName[NAMESIZE], enter[3];
int accountBalance = 0;
char filename[] = "breg.txt";
FILE *file = fopen(filename, "r");
if (file != NULL) {
char line[128];
while (fgets(line, sizeof(line), file) != NULL) {
int count = sscanf(line, "%s %[^;] %d ", accountNr, ownerName, &accountBalance);
printf ("%d [%s] [%s] [%d]\n", count, accountNr, ownerName, accountBalance);
}
fclose(file);
} else {
perror(filename);
}
return 0;
}
它输出:你可以看到这个
2 [123456] [James Doakes] [0]
2 [987987] [Dexter Morgan] [0]
2 [010203] [Masuka Perv] [0]
事实上,即使你改变breg.txt
文件是:
123456 James Doakes; 314159
987987 Dexter Morgan; 271828
010203 Masuka Perv; 42
你仍然得到0
的帐户因为扫描只能成功读取两个项目。
每当您使用的scanf
- 家庭功能之一,你应该检查返回代码,以确保它的扫描项目的正确的号码,如:
int count = sscanf (line, "%s %[^;] %d ", accountNr, ownerName, &accountBalance);
if (count != 3) {
fprintf (stderr, "Catostrophic failure, count is %d\n", count);
return 1;
}
的修复这里相对简单,只需使用%s %[^;]; %d
作为格式字符串。
随着这种变化,你可以看到输出是:
3 [123456] [James Doakes] [314159]
3 [987987] [Dexter Morgan] [271828]
3 [010203] [Masuka Perv] [42]
记住你实际上并不需要的之前%d
的空间(虽然它不会造成伤害)。该特定格式说明符在尝试扫描数字之前跳过空格。
完美,我也意识到我可能是在昨天的正确轨道上,但作为一个新手,你不知道问题出在哪里,所以你最终试图修复好的代码,认为它的代码不好。谢谢! –
尝试'sscanf(line,“%s%[^;];%d”,accountNr,ownerName,&accountBalance);'或检查其返回值,int r = sscanf(line,“%s%[^ ;];%d“,accountNr,ownerName,&accountBalance);如果(r == 3)/ * accountNr,ownerName和accountBalance扫描成功*/else if(r == 2)/ * aaccountNr和ownerName扫描成功*/else if(r == 1)/ * aaccountNr扫描成功* /其他/ *没有扫描成功:(* /' –
当打印ownerName:'printf(“%s \ n”,ownerName)时还要添加一个''n'';' – chqrlie