2010-04-04 23 views
8

Cách nào tốt hơn để xóa đầu vào cin? Tôi nghĩ rằng cin.clearcin.ignore là một cách hay?Xóa đầu vào cin: cin.ignore có phải là một cách hay không?

Code:

void clearInput() 
{ 
    cin.clear(); 
    cin.ignore(1000,'\n'); 
    //cin.ignore(std::numeric_limits<streamsize>::max(), '\n'); 

} 

giáo viên của tôi đã cho tôi câu trả lời này:

này về cơ bản nói rằng clearInput của bạn không hoạt động FYI: bỏ qua KHÔNG BAO GIỜ là một ý tưởng tốt như là một cách của loại bỏ tất cả những gì còn lại trên một dòng

và bạn không thực hiện thử nghiệm này là chính xác lý do tại sao bây giờ đi rõ ràng nó là cách chính xác

Cô cũng nói với tôi điều này như sau:

trên phớt lờ bạn cần phải đoán xét cách nhiều ký tự mà bạn muốn bỏ qua Nếu bạn hoàn toàn biết dữ liệu của bạn và nó tuân theo định dạng nghiêm ngặt - như trong bảng tính Excel , bỏ qua thực sự tốt. Nếu bạn KHÔNG ở trong loại tệp này, thì bạn KHÔNG BAO GIỜ sử dụng bỏ qua. Câu hỏi, là dữ liệu của bạn được định dạng đúng không? Nếu có, hãy sử dụng bỏ qua. Nếu không, không sử dụng bỏ qua.

Liệt kê TẤT CẢ cách nhận dữ liệu? 1) có trích xuất >>

và cũng có ??????

xin liệt kê cho tôi

+0

Tại sao? Anh ta nghĩ bỏ qua có nghĩa là "bỏ qua"? Nó trích xuất và quăng các nhân vật, có lẽ những gì anh ta muốn bạn làm bằng tay. – Duck

+3

Âm thanh như giáo viên của bạn có ý nghĩa như vậy. Theo như tôi biết, 'clear' thì' ignore' là cách tiêu chuẩn để xóa dòng. Sau đó, kiến ​​thức luồng của tôi lại thấp. – GManNickG

+0

Tôi muốn đi xa hơn một chút so với "loại trung bình". Chúc may mắn trên lớp và có vẻ như bạn nên "phớt lờ" anh ấy. – Potatoswatter

Trả lời

4

Câu trả lời của giáo viên của bạn hơi không rõ ràng (ít nhất là với tôi).

Liên quan đến ignore, giáo viên của bạn sai về nguyên tắc: ignorethe standard idiom cách xóa luồng (như được hiển thị bởi Potatocorn, điều này thậm chí được đề cập trong tiêu chuẩn).

Tuy nhiên, điều quan trọng cần lưu ý là cin.ignore(1000)thực sự là một cách không tốt để thực hiện việc này: điều này chỉ giả định rằng sẽ không có nhiều hơn 1000 ký tự trong bộ đệm. Không bao giờ sử dụng số ma thuật như vậy trong ignore.

Thay vào đó, sử dụng một trong hai

  1. cin.rdbuf()->in_avail() (ví dụ: số lượng có sẵn của chars trong bộ đệm đọc) 1), hoặc sử dụng
  2. numeric_limits<streamsize>::max().

1) Thật không may, in_avail được chia trên một số VC gần đây (?) Trình biên dịch vì vậy phương pháp này không phải là rất cầm tay.

+0

đúng, tôi không chắc chắn chính xác những gì cô ấy muốn tôi ở đây .. có trích xuất (>>), tôi đoán người khác mà cô ấy đang nghĩ đến là đường nối? cin.getline và cin.clear có thể được sử dụng trong lĩnh vực này không? và làm cách nào để biết liệu đầu vào có bị xóa không? – codefail

+0

@igor: bạn có thể liên tục 'getline' (hoặc' get') cho đến khi EOF hoặc lỗi được báo hiệu. Nhưng tôi không thấy làm thế nào điều này sẽ được trong bất kỳ cách nào tốt hơn để 'bỏ qua'. –

+0

câu trả lời của cô ấy cho tôi hỏi tại sao tôi không thể sử dụng bỏ qua như con kỳ lân Đỏ được chỉ ra: http://pastebin.com/eTWkPuFb – codefail

5

Copy-dán từ tiêu chuẩn,

basic_istream<charT,traits>& 
ignore(streamsize n = 1, int_type 
delim = traits::eof()); 

Effects: cư xử như một chức năng chưa định dạng đầu vào (như mô tả trong 27.6.1.3, Đoạn 1). Sau khi xây dựng một đối tượng sentry, trích xuất các ký tự và loại bỏ chúng. Nhân vật được chiết xuất cho đến khi bất kỳ sau đây xảy ra:

  • nếu n != numeric_limits<streamsize>::max() (18.2.1), n nhân vật được chiết xuất
  • end-of-file xảy ra trên chuỗi đầu vào (trong trường hợp các chức năng mà gọi setstate(eofbit), có thể ném ios_base::failure (27.4.4.3));
  • c == delim cho ký tự nhập sẵn có tiếp theo c (trong trường hợp này c là được trích xuất).

Bạn nhận xét phù hợp với numeric_limits<>::max là cấp trên, nhưng có vẻ như bạn không muốn sử dụng một cái gì đó bạn không hoàn toàn hiểu, đó cũng là tốt.

Điều duy nhất ai đó có thể muốn bên cạnh ignore là hành vi không chặn, nghĩa là đừng chờ người dùng nhấn phím trả về nếu thiết bị đầu cuối ở chế độ không bị chặn. Nhưng điều đó hoàn toàn không được hỗ trợ bởi iostreams theo như tôi biết.

+0

TILT: "Nếu n! = Numeric_limits :: max() (18.2.1), n ​​ký tự được trích xuất.".Nhưng, không có đề cập đến những gì sẽ xảy ra khi n == number_limits :: max()! – Casey

+0

@Casey Không giới hạn. 'number_limits :: max()' hiếm khi nhỏ hơn 4 GB, vì vậy bạn không may mắn nếu bạn cần bỏ qua chính xác 4 GB + 1. – Potatoswatter

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