2011-11-23 29 views
11

Đây là lần đầu tiên tôi sử dụng stackoverflow. Tôi đã không thể tìm ra thông tin tôi cần về đường dây. Tôi đang ở trong một lớp lập trình đơn giản để chuyển giao kỹ thuật nên mã mà chúng tôi viết khá đơn giản. Tất cả những gì tôi đang cố gắng làm ở đây là đặt một số câu hỏi và câu trả lời do người dùng xác định vào hai mảng khác nhau. Vòng lặp while của tôi trông như thế này (tôi đã sử dụng một vòng lặp for nhưng chuyển sang trong khi chỉ để xem nếu nó sẽ ngăn chặn vi phạm):Tôi không hiểu gì về chuỗi getline?

int main() 
{ 
    srand((unsigned)time(0)); 
    string quest1[100], answ1[100]; 
    int size1, x = 0, num, count1, visit[100], shuffle[100]; 
    fstream flashcard1; 

    cout << "flashcard.cpp by NAME\n" << endl; 
    cout << "This program allows user to manipulate questions and answers for studying.\n" << endl; 
    cout << "\nHow many flash cards will be entered(MAX 100)? "; 
    cin >> size1; 
    cout << endl; 

    while(x < size1) 
    { 
     cout << "Enter Question: "; 
     getline(cin , quest1[x]); 
     cout << endl; 
     x = x++; 

     /* 
     cout << "Enter Answer: " << endl; 
     getline(cin,answ1[x]); 
     cout << endl; 
     flashcard1.open("flashcard1.dat", ios::app); 
     flashcard1 << quest1[x] << " " << answ1[x] << endl; 
     flashcard1.close(); 
     cout << "Data Stored." << endl; 
     */ 
    } 
} 

tôi ghi nhận ra câu trả lời vào phần cũng như lưu dữ liệu đến tập tin chỉ để gỡ lỗi. Khi tôi chạy chương trình nó bỏ qua getline cho câu hỏi đầu tiên, hiển thị vòng lặp thứ hai của "Nhập câu hỏi" và getline hoạt động cho phần còn lại của chúng. Vì vậy, nếu tôi có một size1 của 5, chương trình chỉ điền vào các vị trí mảng 1-4. Hãy giúp tôi. Đây là một chương trình thẻ flash đơn giản sẽ thực hiện tương tự như khi bạn tạo thẻ flash để nghiên cứu và trộn chúng.

+7

'x = x ++;' là Hành vi không xác định. Nó chỉ nên là 'x ++' (hoặc '++ x', hoặc' x + = 1', hoặc 'x = x + 1', hoặc' x - = -1' ....) –

+0

Đó là vì x ++ và ++ x cả hai thay đổi x bằng cách/giảm giá trị của nó bằng 1. Bạn không thể đảm bảo rằng phép gán xảy ra trước hoặc sau này, vì vậy x có thể được gán giá trị của x ++ trước khi gia tăng xảy ra hoặc sau khi nó xảy ra (tiêu chuẩn chỉ không xác định điều này). –

+4

+1 cho câu hỏi hay về SO. –

Trả lời

12

Lý do đó xuất hiện để bỏ qua phiên đầu tiên là bởi vì khi bạn làm

cin >> size1; 

Bạn nhập số và nhấn phím Enter. cin đọc số nguyên và để lại ký tự dòng mới chưa đọc trên vùng đệm, để khi bạn gọi getline, nó như thể bạn nhấn phím enter ngay lập tức và getline không đọc gì cả (vì nó dừng trước khi đọc ký tự dòng mới), loại bỏ dòng mới và đặt chuỗi trống trong quest1[0]. Và đó là lý do tại sao phần còn lại của tác phẩm getline hoạt động chính xác.

Thêm cin.ignore('\n') phía trên vòng lặp của bạn để loại bỏ phần còn lại '\n' và điều đó sẽ hoạt động, chặn các lỗi khác trong mã của bạn.

Và đừng quên thay đổi x = x++ thành chỉ x++ để tránh UB.

+0

cảm ơn bạn! Tôi đã không có kinh nghiệm như một cộng đồng hữu ích trong nhiều năm! – Brent

+0

@Brent nếu điều này trả lời câu hỏi của bạn, hãy đảm bảo nhấp vào dấu kiểm bên cạnh để đánh dấu câu trả lời này là câu trả lời cho câu hỏi của bạn. –

+0

Tôi xin lỗi.Tôi đã ở trong lớp sớm hơn và không thể chỉnh sửa chương trình của tôi, nhưng cho rằng đây là câu trả lời đúng. Khi tôi thêm vào cin.ignore ('n) phía trên vòng lặp của tôi, chương trình không bao giờ đưa ra câu lệnh cout đầu tiên trong vòng lặp vô ích, bạn chỉ cần nhập khoảng nửa tá số lần – Brent

Các vấn đề liên quan