2013-02-26 92 views
9

逗号分隔输入我有以下输入:阅读scanf函数

AG23,VU,Blablublablu,8 
IE22,VU,FooBlaFooBlaFoo,3 
and so on... 

我希望它使用像这样的代码“解析”与scanf函数:

char sem[5]; 
char type[5]; 
char title[80]; 
int value; 

while(scanf("%s,%s,%s,%d", sem, type, title, &value) == 4) { 
//do something with the read line values 
} 

不过的执行代码给我:illegale instruction 你会如何阅读这样一个逗号分隔的文件?

回答

28

逗号不被视为空白字符,因此格式说明符"%s"将消耗,以及线条上超出数组范围sem的其他所有内容,导致未定义的行为。要纠正这一点,你需要使用扫描集:

while (scanf("%4[^,],%4[^,],%79[^,],%d", sem, type, title, &value) == 4) 

其中:

  • %4[^,]意味着阅读最多四个字符,或者直到遇到一个逗号。

指定宽度可防止缓冲区溢出。

-1

您遇到的问题是,因为当你说

scanf("%s,%s,%s,%d", sem, type, title, &value) 

发生的事情是,你正在试图做的是,你是适合所有行成这仅仅是5个字符的第一个字符串。因此,sem[5]溢出,并且各种各样有趣的事情。为了避免这个问题,我尝试了使用表达式%[^,],但它不是很有效。最好的办法是使用类似

while(scanf("%s%c%s%c%s%c%d", sem, &ch, type, &ch, title, &ch, &value) != EOF) 

然后,你可以放弃ch。但是请记住,使用其他函数来读取输入(例如getchar())以及类似的事情会更好,这在某种意义上更快更安全。

+0

你的“最好的选择”的问题是它也不能很好地工作。 – 2018-01-09 21:03:02