2013-02-26 3 views
9

я иметь следующий вход:чтения, разделенных запятыми вход с зсапЕ

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

Я хочу, чтобы «разобрать» с зсапЕ используя код вроде этого:

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 
} 

Но исполнение из code дает мне: 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

Проблема с вашей «лучшей ставкой» заключается в том, что она не совсем работает. –

Смежные вопросы