2013-02-03 44 views
10

Tôi cố gắng lặp qua chuỗi char bằng char. Tôi đã thử một cái gì đó như thế này:Lặp lại qua chuỗi char bằng char

void print(const string& infix) 
{ 
char &exp = infix.c_str(); 
while(&exp!='\0') 
{ 
     cout<< &exp++ << endl; 
    } 
} 

Vì vậy, chức năng này gọi in ("hello"); nên trả lại:

h 
e 
l 
l 
o 

Tôi thử sử dụng mã của mình, nhưng nó không hoạt động chút nào. btw tham số là một tham chiếu không phải là một con trỏ. Cảm ơn bạn

+0

Các tham số có thể là một tài liệu tham khảo, vâng, nhưng như vậy là 'exp' . Nhân tiện, 'std :: string' đã quá tải' operator [] ', và nó có các hàm' begin() 'và' end() ', cũng như làm việc với phiên bản miễn phí của cặp hàm đã nói để lặp lại. – chris

+0

có thể trùng lặp của [Làm thế nào tôi có thể lặp qua một chuỗi và cũng biết chỉ mục (vị trí hiện tại)?] (Http://stackoverflow.com/questions/1315041/how-can-i-iterate-through-a-string- and-also-know-the-index-current-position) – jww

+0

có thể trùng lặp của [Đối với mỗi ký tự trong chuỗi] (http://stackoverflow.com/questions/9438209/for-every-character-in-string) – Csq

Trả lời

10
for(unsigned int i = 0; i<infix.length(); i++) { 
    char c = infix[i]; //this is your character 
} 

Đó là cách tôi đã thực hiện. Không chắc chắn nếu đó là quá "thành ngữ".

+0

@ user1988385, Để in, ngay cả 'std :: cout << infix;' hoạt động. – chris

0

std::string::c_str() trả về const char*, bạn không thể sử dụng char& để giữ. Ngoài ra exp là con trỏ đã có, bạn không cần phải tham khảo:

Better sử dụng iterator mặc dù:

void print(const string& infix) 
{ 
    for (auto c = infix.begin(); c!=infix.end(); ++c) 
    { 
    std::cout << *c << "\n"; 
    } 
    std::cout << std::endl; 
} 

Để khắc phục mã gốc của bạn, hãy thử:

void print(const string& infix) 
{ 
    const char *exp = infix.c_str(); 
    while(*exp!='\0') 
    { 
    cout << *exp << endl; 
    exp++; 
    } 
} 
+0

Có lý do nào chúng tôi sẽ sử dụng char * chỉ trên vòng lặp for (trong câu trả lời của tôi) không? Tôi đã không bao giờ chắc chắn nếu đó là cách người khác đã làm nó. –

+0

@DhaivatPandya, Không thực sự, không. Lặp lại một 'std :: string' bằng cách sử dụng' const char * 'có vẻ như là một nỗ lực vô nghĩa đối với tôi. – chris

+0

Tôi muốn sử dụng trình lặp thay vì vận hành trên con trỏ thô .... – billz

5

Nếu bạn đang sử dụng std::string , thực sự không phải là lý do để làm điều này. Bạn có thể sử dụng vòng lặp:

for (auto i = inflix.begin(); i != inflix.end(); ++i) std::cout << *i << '\n'; 

Đối với mã ban đầu của bạn, bạn nên đã được sử dụng char* thay vì char và bạn không cần tham chiếu.

+0

Nhưng, có lẽ anh ta không chỉ muốn sao chép nó? Anh ta chỉ đơn giản là hỏi làm thế nào để lặp qua ký tự chuỗi ký tự. –

+0

Tùy thuộc vào những gì bạn đang làm với nó, có lẽ một cái gì đó để thay thế cuộc gọi 'copy', mặc dù, mà hoạt động chỉ là về giống nhau. – chris

+0

Điều thú vị về đầu ra là bạn có thể và chỉ nên 'std :: cout << infix;'. Tuy nhiên, cần phải làm bất cứ điều gì khác, một thuật toán hoặc vòng lặp lặp hoạt động. Ngoài ra, nếu sử dụng 'tự động', tôi sẽ sử dụng một dải dựa trên vòng lặp trên một vòng lặp lặp: p – chris

16

Mã của bạn cần một con trỏ, không phải là một tài liệu tham khảo, nhưng nếu sử dụng một trình biên dịch C++ 11, tất cả các bạn cần là:

void print(const std::string& infix) 
{ 
    for(auto c : infix) 
     std::cout << c << std::endl; 
} 
Các vấn đề liên quan