Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Giá trị của biến bị thay đổi không rõ nguyên do khi sử dụng scanf?

  1. #1
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    457

    Mặc định Giá trị của biến bị thay đổi không rõ nguyên do khi sử dụng scanf?

    Mình có code sau
    C++ Code:
    1. #include <cstdio>
    2. using namespace std;
    3.  
    4. int main()
    5. {
    6.     {
    7.         long q, qi;
    8.         short cmd;
    9.         long ind;
    10.         scanf("%ld", &q);
    11.         printf("(q=%ld)",q);
    12.         qi=0;
    13.         while(qi<q)
    14.         {
    15.             scanf("%d %ld", &cmd, &ind);
    16.             printf("(%ld<%ld)", qi, q);
    17.             qi++;
    18.         }
    19.     }
    20. }
    Sau dòng 15 thì giá trị q thay đổi về 0
    Với input "3 4 5" cho kết quả "(q=3)(0<0)"
    Nếu comment dòng 15 hoặc nhập input "3" thì cho kết quả "(q=3)(0<3)(1<3)(2<3)
    Không hiểu gì luôn.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    581

    Mình biên dịch bằng GCC thì có cảnh báo:
    Code:
    test_scanf.cpp|16|warning: format '%d' expects argument of type 'int*', but argument 2 has type 'short int*' [-Wformat=]
    Định dạng short của tham số cmd và định dạng %d của scanf không nhất quán với nhau. Bạn hãy thử thay %d bằng %hd xem sao.

    Xem thêm: http://diendan.congdongcviet.com/threads/t402464::nho-cao-thu-giup-do-devc.cpp?p=913565&highlight=#post913565
    Đã được chỉnh sửa lần cuối bởi Ada : 29-05-2019 lúc 01:25 PM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  3. #3
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    457

    Trích dẫn Nguyên bản được gửi bởi Ada Xem bài viết
    Mình biên dịch bằng GCC thì có cảnh báo:
    Code:
    test_scanf.cpp|16|warning: format '%d' expects argument of type 'int*', but argument 2 has type 'short int*' [-Wformat=]
    Định dạng short của tham số cmd và định dạng %d của scanf không nhất quán với nhau. Bạn hãy thử thay %d bằng %hd xem sao.

    Xem thêm: http://diendan.congdongcviet.com/threads/t402464::nho-cao-thu-giup-do-devc.cpp?p=913565&highlight=#post913565
    Mình đã sửa lại và đã chạy đúng
    Thanks.

  4. #4
    Ngày gia nhập
    08 2017
    Bài viết
    3,363

    Thế nào gọi là đúng?

  5. #5
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    581

    Chú ý rằng code đảo ngược tình thế, vốn thông báo cho scanf ít bộ nhớ hơn thực tế

    C Code:
    1. int cmd;
    2. scanf("%h", &cmd);

    dẫu vô hại trên kiến trúc little-endian, nhưng vẫn là sai: số 1 đọc từ bàn phím vào bộ nhớ có thể bị biến thành 0x10000, 0x1000000000000 hay gì đó hoàn toàn khác trên một big-endian CPU.

    Code chỉ đúng nếu bộ nhớ thực tế bao nhiêu thì thông báo đúng bấy nhiêu.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    Đã được chỉnh sửa lần cuối bởi Ada : 30-05-2019 lúc 09:51 AM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn