JavaScript is required

Kết quả của đoạn chương trình sau là gì?

char c; int n;

scanf("%c%d", &n, &c);

Nếu gõ vào: "r 45".

A.

n=45, c=' '.

B.

n=45, c='r'.

C.

Lỗi khi xây dựng chương trình.

D.
Kết quả khác.
Trả lời:

Đáp án đúng: D


Đoạn chương trình sử dụng `scanf` để đọc dữ liệu từ đầu vào chuẩn. Lỗi nằm ở chỗ định dạng `%c%d` trong `scanf`. Theo định dạng này, chương trình sẽ cố gắng đọc một ký tự vào biến `n` (kiểu `int`) và một số nguyên vào biến `c` (kiểu `char`). Khi nhập "r 45", chương trình sẽ cố gắng đọc ký tự 'r' vào biến `n`. Do `n` là kiểu số nguyên, việc đọc ký tự 'r' vào `n` sẽ dẫn đến lỗi, `scanf` sẽ không thể chuyển đổi 'r' thành một số nguyên hợp lệ. Vì vậy, giá trị của `n` sẽ không được gán (hoặc được gán một giá trị không xác định tùy thuộc vào trình biên dịch). Tiếp theo, `scanf` sẽ cố gắng đọc một số nguyên vào biến `c`. Vì việc đọc 'r' vào `n` đã thất bại, `scanf` sẽ dừng lại và không đọc thêm dữ liệu nào nữa. Do đó, không có đáp án nào trong các lựa chọn là chính xác. Tuy nhiên, có một điểm quan trọng là mặc dù việc đọc sai định dạng có thể dẫn đến kết quả không mong muốn hoặc lỗi, nhưng trong trường hợp này chương trình vẫn sẽ tiếp tục chạy (mặc dù kết quả có thể không đúng như ý muốn). Đáp án D ("Kết quả khác") là đáp án gần đúng nhất trong trường hợp này vì các đáp án khác đều không mô tả chính xác tình huống xảy ra. Tuy nhiên, điều quan trọng cần lưu ý là câu hỏi có vẻ như đang kiểm tra sự hiểu biết về lỗi định dạng trong `scanf`. Trong thực tế, trình biên dịch có thể đưa ra cảnh báo về việc sử dụng sai định dạng, nhưng chương trình vẫn sẽ được xây dựng. Khi chạy, `scanf` sẽ gặp lỗi và có thể không hoạt động như mong đợi. Trong trường hợp này, không có đáp án nào hoàn toàn đúng. Tuy nhiên, theo cách hiểu thông thường, việc `scanf` không thể đọc dữ liệu theo đúng định dạng được xem là một dạng lỗi logic, dẫn đến kết quả không chính xác. Do đó, đáp án D ("Kết quả khác") là hợp lý nhất. Tuy nhiên, cần lưu ý rằng nếu thứ tự đọc được đảo ngược lại thành `%d%c` thì chương trình sẽ báo lỗi khi biên dịch. **Lưu ý:** Do không có đáp án chính xác tuyệt đối, và theo phân tích ở trên, đáp án gần đúng nhất là D. Tuy nhiên, cần hiểu rõ bản chất vấn đề là lỗi định dạng trong `scanf`.

Câu hỏi liên quan