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
    434

    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.

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

    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
    434

    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
    2,641

    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
    557

    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 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