2016-12-19 12 views
6

Điều này liên quan đến sscanf usage - how to verify a completed scan vs an aborted scan nhưng đó là một trường hợp cạnh không được trả lời bởi câu hỏi đó.khớp với văn bản trong sscanf?

char entry[] = "V2X_3_accepted"; 
int d1,d2,ret1,ret2; 
ret1 = sscanf(entry,"V2X_%d_expected",&d1); 
ret2 = sscanf(entry,"V2X_%d_received",&d2); 

Kết quả mong đợi: ret1==0; ret2==0; d1, d2 chưa xác định.

Kết quả thực tế: ret1==1; ret2==1; d1=d2=3.

Sử dụng %n ở cuối sẽ không hữu ích vì các chuỗi đối sánh có chiều dài bằng nhau. Có một số thủ thuật gọn gàng để phù hợp với văn bản sau mà không thực hiện một strncmp liên tiếp hoặc tương tự?

+0

@ user3121023: Tốt! Đăng bài đó làm câu trả lời. –

Trả lời

2

Sử dụng "%n" hoạt động tốt. @user3121023

Đề nghị sử dụng " %n" cho phép tùy chọn trailing trắng-không gian giống như một '\n' để vượt qua "V2X_3_expected\n" và để kiểm tra %n kết quả thất bại "V2X_3_expected 123".

char entry[] = "V2X_3_accepted"; 

int d1,d2; 
int n1 = 0; 
int n2 = 0; 

sscanf(entry,"V2X_%d_expected %n",&d1, &n1); 
sscanf(entry,"V2X_%d_received %n",&d2, &n2); 
if (n1 > 0 && entry[n1] == '\0') Success_expected(d1); 
else if (n2 > 0 && entry[n2] == '\0') Success_received(d2); 
else Fail(entry); 

Initialize n1 đến một giá trị mà sẽ không bao giờ được thiết lập được quét đạt đến "%n" specifier. n1 = 0; hoạt động tốt trong hầu hết các trường hợp như với định dạng OP "V2X_%d_ ...".

n1 = -1; /* and (n1 >= 0 */ cũng hoạt động với các định dạng ngắn như " %n".

-2

Các Statment trở lại của scanf cho bạn biết số lượng gán rằng ông thành công vì vậy nếu bạn yêu cầu một "lấp đầy"

ret1 = sscanf(entry,"V2X_%d_expected",&d1);

và scanf succed giá trị trả về sẽ là 1;

Vì vậy, nó hoàn toàn bình thường.

Bạn có thể tìm tài liệu thêm về cách sử dụng dòng lệnh man scanf

+3

Câu trả lời này không may là hoàn toàn chính xác và hoàn toàn vô dụng. –

+0

Tệ của tôi, tôi không hiểu toàn bộ câu hỏi – Zouz

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