2013-02-26 11 views
9

Mam następujące dane wejściowe:czytać oddzielonych przecinkami wejście z scanf

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

chcę go „analizować” z scanf użyciu kodu takiego:

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 
} 

ale wykonanie kod daje mi: illegale instruction Jak czytasz plik oddzielony przecinkami?

Odpowiedz

28

Przecinek nie jest uważany za biały znak więc format specifier "%s" będą spożywać wszystko inne na linii pisania poza granice tablicy sem powodujących niezdefiniowanej zachowanie , i. Aby rozwiązać ten problem trzeba użyć scanset:

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

gdzie:

  • %4[^,] oznacza przeczytać co najwyżej czterech znaków lub do momentu napotkania przecinek.

Określenie szerokości zapobiega przepełnieniu bufora.

-1

Problem, że masz to, bo kiedy mówisz

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

co się dzieje, jest to, że starają robi jest to, że są sylwetkę całą linię do pierwszego ciągu, który znajduje się zaledwie 5 znaków. Dlatego sem[5] przepełniają się i przepełniają różne rodzaje zabawnych rzeczy. Aby uniknąć tego problemu, próbowałem użyć wyrażenia %[^,], ale to nie działa. Najlepszym kandydatem jest użycie coś jak

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

Następnie można po prostu wyrzucić ch. Należy jednak pamiętać, że lepiej jest używać innych funkcji do wprowadzania danych, takich jak getchar(), i tym podobnych, które w pewnym sensie są znacznie szybsze i bezpieczniejsze.

+0

Problem z twoim "najlepszym zakładem" polega na tym, że nie działa. –

Powiązane problemy