2010-05-04 27 views
24

Giả sử chúng ta có một mã số:Làm thế nào để cin Space trong c + +?

int main() 
{ 
    char a[10]; 
    for(int i = 0; i < 10; i++) 
    { 
     cin>>a[i]; 
     if(a[i] == ' ') 
      cout<<"It is a space!!!"<<endl; 
    } 
    return 0; 
} 

Làm thế nào để cin một biểu tượng không gian từ đầu vào tiêu chuẩn? Nếu bạn viết không gian, chương trình sẽ bỏ qua! :( Có bất kỳ sự kết hợp các biểu tượng (ví dụ như '\ s' hoặc một cái gì đó như thế này) có nghĩa là "không gian" mà tôi có thể sử dụng từ đầu vào tiêu chuẩn cho mã của tôi?

+0

Như xa như tôi có thể nhớ không gian (khoảng trắng?) Được sử dụng để tách các đầu vào khác nhau. Có thể bạn cần phải sử dụng một char * Line; để có được không gian bao gồm. – khmarbaise

+3

Hãy thay đổi '<<<' thành '<<' và sử dụng '==' để kiểm tra sự bình đẳng. Những lỗi chính tả này làm mất tập trung câu trả lời. – Geoff

+0

Lưu ý: Dòng lệnh hạn chế không thực sự có liên quan ở đây. Dòng lệnh được chuyển đổi thành các tham số được chuyển tới hàm main() làm tham số argv. std :: cin đọc từ đầu vào tiêu chuẩn (theo mặc định được kết nối với bàn phím người dùng). –

Trả lời

35

Nó bỏ qua tất cả khoảng trống (dấu cách, tab, dòng mới, v.v.) theo mặc định. Bạn có thể thay đổi hành vi của nó hoặc sử dụng một cơ chế hơi khác. Để thay đổi hành vi của nó, sử dụng thao túng noskipws, như sau:

cin >> noskipws >> a[i]; 

Nhưng, kể từ khi bạn có vẻ như bạn muốn nhìn vào đặc điểm cá nhân, tôi muốn đề nghị sử dụng get, như thế này trước khi vòng lặp của bạn

cin.get(a, n); 

Lưu ý: get sẽ ngừng truy xuất ký tự từ luồng nếu tìm thấy ký tự dòng mới (\n) hoặc sau ký tự n-1. Nó dừng sớm để nó có thể gắn thêm ký tự null (\0) vào mảng. Bạn có thể đọc thêm về giao diện istreamhere.

+1

địa ngục là gì? – dylnmc

+2

@dylnmc bạn đã đọc bài đăng chưa? Bạn sẽ nhận thấy, sau đó, tôi nói 'cin.get' trả về các ký tự' n - 1' từ luồng. – rcollyer

+0

có; không có n – dylnmc

4

Sử dụng cin.get() để đọc các ký tự tiếp theo.

Tuy nhiên, đối với vấn đề này, nó rất hiệu quả để đọc một ký tự cùng một lúc. sử dụng các istream::read() để thay thế.

int main() 
{ 
    char a[10]; 
    cin.read(a, sizeof(a)); 
    for(int i = 0; i < 10; i++) 
    { 
     if(a[i] == ' ') 
      cout<<"It is a space!!!"<<<endl; 
    } 
    return 0; 
} 

Và sử dụng == để kiểm tra sự bình đẳng, không =.

2

Sử dụng toán tử >> của cin sẽ thả khoảng trống phía trước và dừng đầu vào ở khoảng trống cuối đầu tiên. Để lấy toàn bộ dòng đầu vào, bao gồm cả dấu cách, hãy thử cin.getline(). Để lấy một ký tự cùng một lúc, bạn có thể sử dụng cin.get().

+4

Lưu ý rằng 'std :: istream :: getline()' giao dịch với các bộ đệm ký tự và do đó đi kèm với nguy cơ tràn bộ đệm. Sử dụng tốt hơn 'std :: getline (std :: istream &, std :: string &, char c = '')' từ ' '. – sbi

+2

@sbi: Không phải tham số cuối cùng là 'char c = '\ n''? – tiftik

+1

Toán tử >> sẽ thả không gian trắng hàng đầu đọc đối tượng đích bằng cách sử dụng khoảng trắng làm dấu phân tách (vì vậy đối với các POD chuẩn sẽ dừng đọc mục tiêu ở không gian đầu tiên). (Vì vậy, nó không 'chấm dứt' tại không gian màu trắng đầu tiên). Cũng lưu ý, phải rất cẩn thận trong việc sử dụng thuật ngữ 'chấm dứt' nó có một ý nghĩa rất rõ ràng khi nói về C + + –

16
#include <iostream> 
#include <string> 

int main() 
{ 
    std::string a; 
    std::getline(std::cin,a); 
    for(std::string::size_type i = 0; i < a.size(); ++i) 
    { 
     if(a[i] == ' ') 
      std::cout<<"It is a space!!!"<<std::endl; 
    } 
    return 0; 
} 
+0

Tôi muốn sử dụng char, nhưng không phải std :: string. Tôi bị can thiệp để làm những gì tôi muốn với char []. Dù sao cũng cảm ơn. – Narek

+0

bạn vẫn có thể truy cập các ký tự thông qua hàm c_str() hoặc thông qua toán tử [] được hiển thị trong câu trả lời này. chuỗi cũng sẽ cung cấp cho bạn một loạt các chức năng hữu ích: http://www.cplusplus.com/reference/string/string/ – Default

+1

@Narek: Tôi hy vọng bạn có một lý do rất tốt để xử lý các bộ đệm 'char' trần truồng và tôi hy vọng bạn biết nhiều hơn về họ hơn là bạn biết về iostreams. – sbi

0

Tôi có cùng sự cố và tôi chỉ sử dụng cin.getline(input,300);.

noskipwscin.get() đôi khi không dễ sử dụng. Vì bạn có kích thước phù hợp với mảng của mình, hãy thử sử dụng cin.getline() mà không quan tâm đến bất kỳ ký tự nào và đọc toàn bộ dòng trong số ký tự được chỉ định.

5

Để nhập toàn bộ dây chuyền có chứa rất nhiều không gian, bạn có thể sử dụng getline(cin,string_variable);

ví dụ:

string input; 
getline(cin, input); 

Định dạng này bắt tất cả các khoảng trống trong câu cho đến khi return được nhấn

2

Tôi nghĩ tôi 'd chia sẻ câu trả lời đã làm việc cho tôi. Dòng trước đã kết thúc bằng một dòng mới, do đó hầu hết các câu trả lời này không tự hoạt động. Điều này đã làm:

string title; 
do { 
    getline(cin, title); 
} while (title.length() < 2); 

Giả sử đầu vào luôn dài ít nhất 2 ký tự, hoạt động cho trường hợp của tôi. Bạn cũng có thể thử so sánh nó với chuỗi "\n".

1

Hãy thử điều này tất cả bốn cách để lấy đầu vào với không gian :)

#include<iostream> 
#include<stdio.h> 

using namespace std; 

void dinput(char *a) 
{ 
    for(int i=0;; i++) 
    { 
     cin >> noskipws >> a[i]; 
     if(a[i]=='\n') 
     { 
      a[i]='\0'; 
      break; 
     } 
    } 
} 


void input(char *a) 
{ 
    //cout<<"\nInput string: "; 

    for(int i=0;; i++) 
    { 
     *(a+i*sizeof(char))=getchar(); 

     if(*(a+i*sizeof(char))=='\n') 
     { 
      *(a+i*sizeof(char))='\0'; 
      break; 
     } 

    } 
} 



int main() 
{ 
    char a[20]; 

    cout<<"\n1st method\n"; 
    input(a); 
    cout<<a; 

    cout<<"\n2nd method\n"; 
    cin.get(a,10); 
    cout<<a; 

    cout<<"\n3rd method\n"; 
    cin.sync(); 
    cin.getline(a,sizeof(a)); 
    cout<<a; 

    cout<<"\n4th method\n"; 
    dinput(a); 
    cout<<a; 

    return 0; 
} 
Các vấn đề liên quan