2015-04-19 60 views
1

我有标签分隔的记录,像这样 sscanf的输入工作不

1000 Muhammad Aashir 0213-4211685 123456 0 

第一我已阅读使用fgets和我现在想用sscanf的提取内容的线,但有一个意想不到的问题。 ..请帮助我初学

这里是代码

char buffer[SIZE]; 
Account req; 
while(fgets(buffer,SIZE,fptr)) 
{ 
    cout<<endl<<buffer<<endl; 
    sscanf(buffer,"%d\t%s\t%s\t%s\t%ld\n",&req.acc_num,req.name,req.mobileno,req.pass,&req.acc_bal); 
    cout<<endl<<req.pass; 
} 

BUFFER的输出是一样的记录行

但提取值之后,当我显示“req.pass”的值是不正确

req.pass显示的是“0213-4211685”,但它具有显示“123456”

+2

'sscanf()'返回成功读取的项数:测试这个数是判断sscanf()是否成功的一种方法。 – francis

+2

''%d \ t%[^ \ t] \ t%s \ t%s \ t%ld \ n“'而不是%\ t%s \ t%s \ t% ld \ n“' – BLUEPIXY

+0

@BLUEPIXY像魔术一样工作,顺便说一下[^ \ t]?为什么你用它来代替%s – CodeLearner

回答

3

sscanf的将捕获到达任何类型的空白。在你的情况下,req.name只包含Muhammad。这将导致其余的变量包含错误的信息。

如果您需要使用sscanf(),您必须将名称中的“”实例替换为转义字符,例如“_”。

+0

感谢iharob的原因! – CodeLearner

+0

@CodeLearner不客气? ;) – Cubia