Khai báo kiểu int là số nguyên, tại sao nhập kí tự a, b, c vẫn ra kết quả?

có ra kết quả đâu, em có check giá trị trả về của dòng scanf đó chưa :hocho: scanf trả về 0 là fail, a chưa có giá trị gì nghĩa là nó mang giá trị rác “ngẫu nhiên” thôi

viết thế này vẫn “chạy” được:

int a;
if (a % 2 == 0) { ... }

nhưng a mang giá trị rác và a%2 ra 0 hay 1 cũng được. Theo chuẩn của C thì đọc giá trị chưa khởi tạo là undefined behavior: https://en.cppreference.com/w/c/language/behavior#Uninitialized_scalar khi gặp UB thì trình dịch nó muốn dịch thế nào cũng được, có khi big bang cũng là từ 1 lỗi UB của god ko chừng :hocho: :hocho:

để tránh lỗi UB này thì em nên luôn khởi tạo giá trị cho mọi biến trong C. Kể cả khi scanf giá trị cho nó ngay sau đó, vì gặp trường hợp nhập sai mà quên check như trong code của em thì lại tưởng đã nhập được giá trị nào đó lúc chẵn lúc lẻ :hocho:

check giá trị scanf trả về đàng hoàng:

int scanf_result = scanf("%d", &a);
if (scanf_result == 1) { // đọc thành công

} else { // ko đọc được

}

theo chuẩn https://en.cppreference.com/w/c/io/fscanf#Return_value thì giá trị trả về của scanf là số lượng biến nhập thành công. Ở đây số lượng biến nhập là 1, có thể check scanf_result == 0 để check khi nào nhập thất bại, nhưng khi nhập thất bại giá trị trả về có thể là EOF ko phải là 0 nên check scanf_result == 1 chính xác hơn

2 Likes

dạ e check hết rồi, số vẫn ra kết quả đúng hết, bấm phím chữ là nó cứ ra chẵn, e mới học nên k rành lắm, e chưa quen mấy thuật ngữ trong lập trình, kiểu như e chỉ muốn đơn giản là 3 vế số nào chia hết cho 2 thì chẵn, k chia hết cho 2 là lẻ, còn mấy phím kí tự a, b, c …v.v thì printf " k chính xác " chẳng hạn, mà e đổi tới đổi lui cũng k đc , cảm ơn a nhiều , để e mò thêm, mà a cho e hỏi cái phần mềm e đang xài nó hay lỗi lỗi phải k ạ, code y chang trên mạng chạy vẫn sai, mà thoát ra vào chạy lại thì đúng

lúc chạy sai lúc chạy đúng là lỗi UB là chạy sai đó :hocho:

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?