Tôi muốn sscanf một dòng và chắc chắn rằng không có gì nhiều hơn sau đó những gì tôi muốn trong đó. Mã này trông như thế này:Làm thế nào để sscanf để đảm bảo bộ đệm là chính xác những gì tôi muốn?
void parse_init_command(char *buffer, command *new_command) {
if (sscanf(buffer,
"%s %d %d %d %d %d %d %d\n",
new_command->name,
&new_command->data[0],
&new_command->data[1],
&new_command->data[2],
&new_command->data[3],
&new_command->data[4],
&new_command->data[5],
&new_command->data[6]) != 8) {
strncpy(new_command->name, "WRONG_INPUT", 15);
}
}
Khi tôi nhận được một đầu vào như:
INIT 9 11 3 1 1 1 9
mọi thứ đều tốt, nhưng sau đó một đầu vào như thế này
INIT 9 11 3 1 1 1 9 s
cũng được chấp nhận. Tôi nghĩ rằng nếu tôi thêm "\ n" mọi thứ sẽ hoạt động tốt, vì tôi biết rằng mọi dòng đầu vào đều kết thúc bằng một EOL, nhưng nó không thành công.
'scanf' coi ký tự dòng mới là khoảng trắng, giống như các tab và dấu cách. Bạn có thể đọc giá trị giả thứ chín, một chuỗi ngắn với giá trị cực đại được thực thi. width ('% 2s') có lẽ, và bắt buộc rằng số lượng chuyển đổi không vượt quá 8. –
Bộ đệm của bạn có được khởi tạo trước khi được chuyển vào hàm này không? – bentank