2013-02-26 72 views
9

tôi có đầu vào sau:đọc đầu vào bằng dấu phẩy với scanf

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

tôi muốn nó để "phân tích" với scanf sử dụng một số mã như thế này:

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 
} 

Nhưng việc thực hiện mã cho tôi: illegale instruction Bạn sẽ đọc một tệp được phân cách bằng dấu phẩy như thế nào?

Trả lời

28

Dấu phẩy không được coi là ký tự khoảng trắng để định dạng số "%s" sẽ tiêu thụ , và mọi thứ khác trên dòng ghi ngoài giới hạn của mảng sem gây ra hành vi chưa xác định. Để khắc phục điều này, bạn cần phải sử dụng một scanset:

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

nơi:

  • %4[^,] có nghĩa là đọc nhiều nhất là bốn nhân vật hoặc cho đến khi dấu phẩy là gặp phải.

Chỉ định chiều rộng ngăn chặn tràn bộ đệm.

-1

Vấn đề mà bạn đang gặp là bởi vì khi bạn nói

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

những gì xảy ra là bạn đang cố gắng làm là rằng bạn đang phù hợp tất cả các dòng vào chuỗi đầu tiên mà chỉ là 5 ký tự. Do đó, sem[5] tràn qua và làm mọi thứ vui nhộn. Để tránh vấn đề này, tôi đã thử sử dụng biểu thức %[^,], nhưng nó không hoạt động. Đặt cược tốt nhất là sử dụng một cái gì đó như

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

Sau đó, bạn chỉ có thể hủy ch. Tuy nhiên, hãy nhớ rằng tốt hơn là sử dụng các chức năng khác để đọc đầu vào như getchar() và những thứ tương tự, nhanh hơn và an toàn hơn nhiều trong một số ý nghĩa.

+0

Vấn đề với "đặt cược tốt nhất" của bạn là nó không hoạt động được. –

Các vấn đề liên quan