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ố 14 kết quả

Đề tài: 2 chuỗi bị bỏ qua 1 chuỗi

  1. #1
    Ngày gia nhập
    03 2008
    Nơi ở
    TP HCM
    Bài viết
    27

    Mặc định 2 chuỗi bị bỏ qua 1 chuỗi

    Mình có code thế này. Do tâp tành về chuỗi thôi, ko hiểu sao khi quay lại (vòng do.... while ) thì nó lại bỏ qua 1 chuỗi đầu tiên - Ko cho nhập. Mong các bạn xem qua và giải thích giùm vì sao nó như vậy.
    C Code:
    1. #include <iostream>
    2. using namespace std;
    3. void main()
    4. {
    5.     char a[100],b[100],c;
    6.     int n;
    7.     do
    8.     {
    9.     cout<<"Nhap ten ban thu 1: ";
    10.     cin.getline(a,100);
    11.     cout<<"\nNhap ten ban thu 2: ";
    12.     cin.getline(b,100);
    13.     cout<<"\nBan hay nhap vao mot so: ";cin>>n;
    14.     if(n%2==0)
    15.         {cout<<a<<" VA "<<b;
    16.         cout<<endl;}
    17.     else   
    18.         {cout<<a<<" HOAC "<<b;
    19.          cout<<endl;}
    20.     cout<<"Tiep tuc (C/K) ";cin>>c;
    21.     }while(c=='c'||c=='C');
    22. }

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

    C++ Code:
    1. #include <iostream>
    2. using namespace std;
    3. void main()
    4. {
    5.     char a[100],b[100],c;
    6.     int n;
    7.     do
    8.     {
    9.     cout<<"\nNhap ten ban thu 1: ";
    10.     cin.getline(a,100);
    11.     cout<< "\nNhap ten ban thu 2: ";
    12.     cin.getline(b,100);
    13.     cout<<"\nBan hay nhap vao mot so: ";cin>>n;
    14.     if(n%2==0)
    15.         {cout<<a<<" VA "<<b;
    16.         cout<<endl;}
    17.     else  
    18.         {cout<<a<<" HOAC "<<b;
    19.          cout<<endl;}
    20.     cout<<"Tiep tuc (C/K) ";cin>>c;
    21.     cin.ignore();//Thêm dòng này.
    22.     }while(c=='c'||c=='C');
    23. }
    Thên dòng cin.ignore()

  3. #3
    Ngày gia nhập
    03 2008
    Nơi ở
    TP HCM
    Bài viết
    27

    trước tiên, thanks bạn nha!
    Bạn có thể giải thích vì sao mình ko đặt cin.ignore ngay sau lúc nhập mỗi chuỗi. Mà lại đặt vị trí đó. Xin lỗi vì mình còn yếu

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

    Nếu để lên đầu thì khi nhập lần đầu nó sẽ bị dừng phải ấn ENTER gây khó chịu thế thôi.
    Chạy thấy có vấn đề thì mới thêm không thì thôi.
    Chạy lỗi ở đâu thì thêm vào đó.
    (mình không có hay viết console)

  5. #5
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    cin.ignore giống như fflush(stdin) của C dùng để xoá kí tự chuyển dòng trong vùng nhớ đệm, tránh trôi chương trình khi sử dụng cin.get và cin (1 kí tự)

  6. #6
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    Mặc định 2 chuỗi bị bỏ qua 1 chuỗi

    @Trương Phan Bình : bạn ơi đây là box C. Box C++ ở bên trên bạn à.
    về vấn đề của bạn : bạn chưa nắm được chắc lý thuyết . Bạn có thể mở sách của bạn ra và tìm. Trong sách giáo khoa của bạn chắc chắn có phần nói về stdin và lỗi khi nhập chuỗi với stdin. ( vấn đề này là vấn đề muôn thuở , sách nào cũng nói , mình sẽ ko nhắc lại nữa )

    nếu bạn học C có thể dùng fflush(stdin);
    hàm fflush là hàm chuẩn về xuất nhập nên chắc chắn nằm trong stdio.h ( standard input/output )
    và stdin là luồng dữ liệu vào : standard input

    Nếu bạn học C++ thì vào box C++ hỏi mình sẽ giải thích cụ thể
    @all: ở đây các bạn : đang nhầm giữa C và C++
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

  7. #7
    Ngày gia nhập
    03 2008
    Nơi ở
    TP HCM
    Bài viết
    27

    mong mod move giùm mình topic này sang box C++ giùm. Thanks

  8. #8
    Ngày gia nhập
    03 2008
    Nơi ở
    TP HCM
    Bài viết
    27

    Mình có đọc phần này rồi. Trong sách là thế này
    - Khi nhập dữ liệu lớn hơn MAX - 1 (trong bài này là 99) thì sẽ ảnh hưởng đến lệnh nhập sau hoặc ảnh hưởng đến hoạt động máy tính
    - Để khắc phục : Dùng lệnh cin.ignore(int n, '\n') hoặc fflush(stdin) và thông thường ta dùng n = 127 (dùng để bỏ qua tối đa 127 trong vùng đệm hoặc khi gặp phím enter (\n) thì kết thúc lệnh cin

    Mình có 2 vấn đề muốn hỏi các bạn : n là n gì (ko rõ ), và trong bài phía bên bạn dùng cin.ignore mà ko có tham số n. Và : mình chưa dùng hết số phần tử đã khai báo là 99 ? (a[100] và b[100] )
    Đã được chỉnh sửa lần cuối bởi truongphanbinh : 27-07-2008 lúc 02:22 PM.

  9. #9
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    Trích dẫn Nguyên bản được gửi bởi Trương Phan Bình Xem bài viết
    Mình có đọc phần này rồi. Trong sách là thế này
    - Khi nhập dữ liệu lớn hơn MAX - 1 (trong bài này là 99) thì sẽ ảnh hưởng đến lệnh nhập sau hoặc ảnh hưởng đến hoạt động máy tính
    - Để khắc phục : Dùng lệnh cin.ignore(int n, '\n') hoặc fflush(stdin) và thông thường ta dùng n = 127 (dùng để bỏ qua tối đa 127 trong vùng đệm hoặc khi gặp phím enter (\n) thì kết thúc lệnh cin

    Mình có 2 vấn đề muốn hỏi các bạn : n là n gì (ko rõ ), và trong bài phía bên bạn dùng cin.ignore mà ko có tham số n. Và : mình chưa dùng hết số phần tử đã khai báo là 99 ? (a[100] và b[100] )
    mình ko biết bạn đang nói về cái gì cả. Để mình giải thích về hiện tượng trôi này cho bạn.

    đầu tiên về stdin: là luồng dữ liệu vào. Khi bạn ấn các nút trên phím thì các nút này sẽ được đưa vào stdin ( là 1 data stream ).
    Các hàm của bạn dùng ví dụ gets() đọc thông tin từ stdin chứ ko phải là nó đọc trừ tiếp từ bàn phím.

    ví dụ đoạn code sau :

    PHP Code:
    printf("Nhập vào họ tên 1 : ");
    gets(a);
    printf("Nhập vào họ tên 2: ");
    gets(b); 
    ( box C nên tôi trình bày bằng ngôn ngữ C )
    giả sử khi chạy tôi nhập vào như sau :

    Bùi Tấn Quang\n

    ( \n có nghĩa là tôi ấn enter ( minh họa vậy) )

    sdtin nó sẽ như sau :

    Bui Tan Quang\n

    stdin là 1 dãy dài các key được đưa vào. vậy làm sao chương trình biến nó đang được xử lý ở đâu ??? Sẽ phải có 1 con trỏ của stdin chỉ rõ xem chương trình đã nhập đến đoạn nào rồi. Khi mới bắt đầu thì con trỏ này sẽ trỏ vào ký tự đầu tiên của stdin . Tôi bôi đỏ chữ B có nghĩa nó đang trỏ đến stdin.

    sau khi ấn enter thì hàm gets() sẽ hoạt động nó lấy các ký tự từ vị trí con trỏ stdin và dừng lại ở "\n" gần nhất
    >>> sau khi hàm gets() thứ nhất chạy con trỏ stdin trỏ vào \n trong stdin

    Bui Tan Quang\n


    tiếp theo đến hàm gets() thứ 2 chạy. Nó lấy các kí tự bắt đầu từ vị trí con trỏ stdin hiện tại đến vị trí \n gần nhất. Vấn đề là con trỏ đang trỏ vào \n >> hàm gets() thứ 2 sẽ ko lấy được gì cả >> hàm gets() thứ 2 bị trôi......

    Bui Tan Quang\n


    Vậy để giải quyết vấn đề này ta làm thế nào ?
    có 2 cách :
    cách 1 : đưa con trỏ stdin về vị trí đầu tiên trong stdin : fflush(stdin); . Sau khi đưa về đầu thì coi như stdin của bạn đang rỗng. Hàm gets() thứ 2 sẽ hoạt động bình thường...
    cách 2 : bỏ qua cái "\n" đang làm gets() bị giắt . ví dụ đơn giản chỉ cần getch() 1 phát..
    (với C++ tôi ko trình bày)


    ok ?
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

  10. #10
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Trích dẫn Nguyên bản được gửi bởi Trương Phan Bình Xem bài viết
    Mình có đọc phần này rồi. Trong sách là thế này
    - Khi nhập dữ liệu lớn hơn MAX - 1 (trong bài này là 99) thì sẽ ảnh hưởng đến lệnh nhập sau hoặc ảnh hưởng đến hoạt động máy tính
    - Để khắc phục : Dùng lệnh cin.ignore(int n, '\n') hoặc fflush(stdin) và thông thường ta dùng n = 127 (dùng để bỏ qua tối đa 127 trong vùng đệm hoặc khi gặp phím enter (\n) thì kết thúc lệnh cin

    Mình có 2 vấn đề muốn hỏi các bạn : n là n gì (ko rõ ), và trong bài phía bên bạn dùng cin.ignore mà ko có tham số n. Và : mình chưa dùng hết số phần tử đã khai báo là 99 ? (a[100] và b[100] )
    Anh langman đã giải thích rất rõ cho bạn là tại sao cần dùng fflush(stdin) cũng như cin.ignore().
    Nhưng mình muốn giải thích thêm cái bạn hỏi
    Dùng lệnh cin.ignore(int n, '\n'); n ở đây là số byte trong stream muốn xoá, câu lệnh cin.ignore(127, '\n'); sẽ xoá 127 byte và kí tự xuống dòng, dùng cin.ignore(); không tham số sẽ xoá kí tự xuống dòng. Bạn viết khi dùng hết số phần tử (ở đây là 99) phải dùng cin.ignore(int n, '\n'); vì nếu dùng cin.ignore(); chỉ xoá kí tự chuyển dòng, bộ nhớ vẫn full không thể nhập tiếp đc.

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

  1. Bài tập C++ Cách để so sánh 2 chuỗi kí tự giữa chuỗi nhập từ phím và chuỗi từ file xem có giống nhau không?
    Gửi bởi davilson18 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 09-06-2012, 09:47 AM
  2. Lập trình C Thay thế chuỗi s1 trong chuỗi s bằng chuỗi s
    Gửi bởi duytue trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 23-09-2011, 04:16 PM
  3. thay thế chuỗi con thứ i trong chuỗi mẹ bằng 1 chuỗi khác
    Gửi bởi nhat1811 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 06-08-2011, 08:25 AM
  4. Trả lời: 1
    Bài viết cuối: 29-06-2011, 12:02 AM
  5. xem một từ trong chuỗi là một chuỗi con, sắp xếp các chuỗi con theo thứ tự tăng dần
    Gửi bởi qpkdct1101 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 20-01-2011, 08:22 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