Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 15 kết quả

Đề tài: Input - Phân biệt giữ %1s và %c

  1. #1
    Ngày gia nhập
    02 2008
    Bài viết
    2

    Question Input - Phân biệt giữ %1s và %c

    Mình chỉ mới vừa học C thôi, đang định làm 1 bài tập có đề như sau: "Nhập 2 số nguyên bất kỳ, sau đó chọn 1 trong 4 phép toán (cộng, trừ, nhân, chia) rồi thực hiện phép toán đó với 2 số đã nhập." Lúc đầu mình viết như sau (đây mới chỉ là 1 fần, chưa fải toàn bộ bài):

    Code:
    #include<stdio.h>
    void main()
    {
    	int x, y;
    	char op;
    	printf("Input two variable: ");
    	scanf("%d %d", &x, &y);
    	printf("\nx=%d; y=%d", x, y);
    	printf("\nEnter any operator (+,-,*,/): ");
    	scanf("%1s", &op);
    	printf("\nx=%d; y=%d", x, y);
    }
    thì cái biến y sau khi chọn phép toán tự động bị gán bằng 0. Nếu thay đoạn code trên bằng:

    Code:
    #include<stdio.h>
    void main()
    {
    	int x, y;
    	char op;
    	printf("Input two variable: ");
    	scanf("%d %d", &x, &y);
    	printf("\nx=%d; y=%d", x, y);
            flushall();
    	printf("\nEnter any operator (+,-,*,/): ");
    	scanf("%c", &op);
    	printf("\nx=%d; y=%d", x, y);
    }
    thì ko có gì xảy ra, y vẫn giữ nguyên giá trị đc input vào.
    Mình ko hiểu tại sao lại bị vậy, có bạn nào biết thì giải thích dùm. Cảm ơn nhiều

    Lưu ý: Để code vào tag code mỗi khi đưa code lên diễn đàn. Đọc Nội quy để biết thêm chi tiết.
    Đã được chỉnh sửa lần cuối bởi Kevin Hoang : 28-02-2008 lúc 12:59 AM. Lý do: Nhắc nhở

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Code:
    scanf("%1s", &op);
    Cái này chắc do chuỗi nên nó còn kí tự null '\0' . Cái kia đúng vì %c là character là đúng rùi. Bạn cũng thấy rõ ràng mà .
    Coi mã assembler nó sinh ra nè :
    Code:
    int main()
    {
    00411B20  push        ebp  
    00411B21  mov         ebp,esp 
    00411B23  sub         esp,0E4h 
    00411B29  push        ebx  
    00411B2A  push        esi  
    00411B2B  push        edi  
    00411B2C  lea         edi,[ebp-0E4h] 
    00411B32  mov         ecx,39h 
    00411B37  mov         eax,0CCCCCCCCh 
    00411B3C  rep stos    dword ptr [edi] 
    	int x, y;
    	char op;
    	printf("Input two variable: ");
    00411B3E  push        offset string "Input two variable: " (427060h) 
    00411B43  call        @ILT+1280(_printf) (411505h) 
    00411B48  add         esp,4 
    	scanf("%d %d", &x, &y);
    00411B4B  lea         eax,[y] 
    00411B4E  push        eax  
    00411B4F  lea         ecx,[x] 
    00411B52  push        ecx  
    00411B53  push        offset string "%d %d" (427058h) 
    00411B58  call        @ILT+985(_scanf) (4113DEh) 
    00411B5D  add         esp,0Ch 
    	printf("\nx=%d; y=%d", x, y);
    00411B60  mov         eax,dword ptr [y] 
    00411B63  push        eax  
    00411B64  mov         ecx,dword ptr [x] 
    00411B67  push        ecx  
    00411B68  push        offset string "\nx=%d; y=%d" (427048h) 
    00411B6D  call        @ILT+1280(_printf) (411505h) 
    00411B72  add         esp,0Ch 
    	printf("\nEnter any operator (+,-,*,/): ");
    00411B75  push        offset string "\nEnter any operator (+,-,*,/): " (427020h) 
    00411B7A  call        @ILT+1280(_printf) (411505h) 
    00411B7F  add         esp,4 
    	scanf("%1s", &op);
    00411B82  lea         eax,[op] 
    00411B85  push        eax  
    00411B86  push        offset string "%1s" (42701Ch) 
    00411B8B  call        @ILT+985(_scanf) (4113DEh) 
    00411B90  add         esp,8 
    	printf("\nx=%d; y=%d", x, y);
    00411B93  mov         eax,dword ptr [y] 
    00411B96  push        eax  
    00411B97  mov         ecx,dword ptr [x] 
    00411B9A  push        ecx  
    00411B9B  push        offset string "\nx=%d; y=%d" (427048h) 
    00411BA0  call        @ILT+1280(_printf) (411505h) 
    00411BA5  add         esp,0Ch 
    }
    Tui dùng visual 2003 ở trường nó error runtime y không xuất ra được luôn, ko rành C lắm nhưng tui đoán thì chắc là vậy T_T !

  3. #3
    Ngày gia nhập
    11 2007
    Bài viết
    153

    Ọc ọc RR ơi cái này không cần view cả cái bảng to đùng như thế ra đâu.Bạn "hightwind2501" cho mình hỏi nhé nếu bạn muốn tính 1 phép tính trừ thì bạn phải lấy 2 số trừ đi nhau đúng không nào? Ví dụ ở đây lấy 5 - 3 = 2 , vậy lúc bạn nhập trường hợp phép tính thì bạn đã thực hiện trừ chưa? hay bạn chỉ gán dấu của phép tính cho 1 biến và chẳng làm gì cả.Đúng không nào? theo mình thì bạn có thể làm theo cấu trúc swith case để tính phép tính cộng trừ nhân chia cũng được.
    Code:
    scanf("%d %d", &x, &y);
    ở đây bạn type dấu cách vào đoạn %d , bạn không nên type dấu cách vào lệnh scanf như thế sẽ gây lỗi cho bài.
    Phải là:
    Code:
    scanf("%d%d", &x,&y);
    Như thế sẽ đúng hơn.Bạn cứ code thử đi sau đó đưa lên đây mình sẽ cố gắng giải đáp trong phạm vi hiểu biết không thì mọi người sẽ giúp bạn
    Have fun!!
    ttecak ?

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    scanf("%d%d", &x,&y);
    Cách ra có gây khác biệt à baby, thiệt là không biết cái này. Cứ tưởng nó giống nhau, để thử lại xem sao, cứ nghĩ là thằng %1s có vấn đề ! thanks Baby nhé T_T ! -->Gà C ^_^ !

  5. #5
    Ngày gia nhập
    12 2007
    Bài viết
    224

    scanf("%1s", &op);
    Thực ra thì bạn đừng nên quét cả chuỗi vào trong một biến ký tự như vậy . Ko thể được và cũng ko nên dùng như thế , sẽ dẫn đến sai lầm ko chắc trước . ký tự chuyển dạng nên phù hợp với biến thì hay hơn .

  6. #6
    Ngày gia nhập
    12 2007
    Nơi ở
    giữa thiên đường và địa ngục
    Bài viết
    91

    Mặc định Input - Phân biệt giữ %1s và %c

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    Cách ra có gây khác biệt à baby, thiệt là không biết cái này. Cứ tưởng nó giống nhau, để thử lại xem sao, cứ nghĩ là thằng %1s có vấn đề ! thanks Baby nhé T_T ! -->Gà C ^_^ !
    có cách hay ko cách làm gì có khác biệt mà,mình toàn xài dâu cách để bài nhin đẹp hơn,
    NOTE:minh dùng TC
    Tinh Quái,

    Vâng, là Chjp Xinh. Đanh đá và điêu ngoa
    .

  7. #7
    Ngày gia nhập
    11 2007
    Bài viết
    153

    Sặc thử type dấu cách với trình biên dịch BC xem nhóc, nó không báo lỗi gì đâu nhưng chương trình sẽ không chạy theo ý mình đâu.

    @ Chị Phương : báo cáo xếp em xin nghỉ cái vụ C# vì độ này bận quá.Sắp thi rồi ,chị thông cảm nha thông báo cho các thành viên khác dùm em.
    ttecak ?

  8. #8
    Ngày gia nhập
    02 2008
    Bài viết
    2

    @comeonbaby: mình đã thử cách bạn nói nhưng vẫn bị :(
    Mấy bạn thử chạy đoạn code của mình, sẽ thấy giá trị của biến y trước và sau dòng:
    Code:
    printf("\nEnter any operator (+,-,*,/): ");
    	scanf("%1s", &op);
    hoàn toàn khác nhau.
    Có ai giải đáp dùm mình với :(

  9. #9
    Ngày gia nhập
    12 2007
    Bài viết
    28

    Mình không rõ vấn đề này lắm, nhưng bạn thử dùng thêm fflush(stdin); thử xem.
    Mà nhân tiện, bạn cho mình hỏi lệnh scanf("%1s", &op) có nghĩa gì vậy?
    Lúc trước mình chỉ học kiểu scanf("%s", &op) hoặc dùng gets() thôi.

  10. #10
    Ngày gia nhập
    12 2007
    Bài viết
    3

    Trích dẫn Nguyên bản được gửi bởi highwind2501 Xem bài viết
    @comeonbaby: mình đã thử cách bạn nói nhưng vẫn bị :(
    Mấy bạn thử chạy đoạn code của mình, sẽ thấy giá trị của biến y trước và sau dòng:
    Code:
    printf("\nEnter any operator (+,-,*,/): ");
    	scanf("%1s", &op);
    hoàn toàn khác nhau.
    Có ai giải đáp dùm mình với :(
    _Cái này là do xung đột vùng nhớ. Khi bạn khai báo "char op" thì chương trình cấp phát cho biến op vùng nhớ có kích thước 1 byte, vùng nhớ này có địa chỉ xxx0 nào đó.
    Với "%1s" chương trình sẽ đưa chuỗi là ký tự đầu tiên khi ta nhập, vào vùng nhớ có địa chỉ xxx0, mà chuỗi phải có ký tự kết thúc chuỗi '\0'. Như vậy với câu lệnh trên chương trình cần đến 2 byte (1 byte chứa ký tự mà ta nhập, 1 byte chứa ký tự kết thúc chuỗi), dẫn đến ghi đè giá trị '\0' vào vùng nhớ có địa chỉ kế tiếp là xxx1. Mà chẳng may, địa chỉ xxx1 chính là địa chỉ của biến y .
    Mình diễn giải hơi lung tung, bạn xem hình minh họa trước và sau câu lệnh "scanf("%1s", &op);" chắc sẽ hiểu:
    Ở đây mình nhập x = 1, y = 2, op = '+' = 0x2B
    Trước:



    Sau:



    _Còn với "%c" chỉ cần đúng 1 byte --> ko tranh chấp vùng nhớ với biến y --> chạy đúng.
    Hic, giải thích lung tung quá :((, hy vọng bạn hiểu ý mình.

Các đề tài tương tự

  1. Sự khác nhau giữa input type="text" và input type="submit" và type ="button"
    Gửi bởi tuanngocpt trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 2
    Bài viết cuối: 04-04-2012, 12:55 AM
  2. Cách input ngày tháng SQL
    Gửi bởi dotritiep trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 04-05-2011, 09:28 PM
  3. Hỏi về input box.
    Gửi bởi knatalia trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 2
    Bài viết cuối: 06-05-2010, 10:35 PM
  4. Cho em hỏi về input sau a.out và đọc kiểu dữ liệu
    Gửi bởi hocprogram trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 03-05-2010, 11:07 PM
  5. Câu hỏi về input :(
    Gửi bởi tantripy trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 7
    Bài viết cuối: 15-09-2008, 08:25 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