Làm thế nào tôi có thể thực hiện một vòng lặp for trên mỗi ký tự trong chuỗi trong C ++?
char
, Điểm mã Unicode, cụm grapheme mở rộng?
index
phần trong câu trả lời.
Làm thế nào tôi có thể thực hiện một vòng lặp for trên mỗi ký tự trong chuỗi trong C ++?
char
, Điểm mã Unicode, cụm grapheme mở rộng?
index
phần trong câu trả lời.
Câu trả lời:
Xoay quanh các ký tự của a std::string
, sử dụng vòng lặp dựa trên phạm vi (từ C ++ 11, đã được hỗ trợ trong các bản phát hành gần đây của GCC, clang và VC11 beta):
std::string str = ???;
for(char& c : str) {
do_things_with(c);
}
Vòng qua các ký tự của a std::string
với các vòng lặp:
std::string str = ???;
for(std::string::iterator it = str.begin(); it != str.end(); ++it) {
do_things_with(*it);
}
Xoay quanh các nhân vật của a std::string
với một vòng lặp lỗi thời:
std::string str = ???;
for(std::string::size_type i = 0; i < str.size(); ++i) {
do_things_with(str[i]);
}
Xoay quanh các ký tự của một mảng ký tự kết thúc null:
char* str = ???;
for(char* it = str; *it; ++it) {
do_things_with(*it);
}
std::string
, mà chỉ là một loạt các byte.
Một vòng lặp for có thể được thực hiện như thế này:
string str("HELLO");
for (int i = 0; i < str.size(); i++){
cout << str[i];
}
Điều này sẽ in ký tự chuỗi theo ký tự. str[i]
trả về ký tự tại chỉ mục i
.
Nếu đó là một mảng ký tự:
char str[6] = "hello";
for (int i = 0; str[i] != '\0'; i++){
cout << str[i];
}
Về cơ bản trên hai là hai loại chuỗi được hỗ trợ bởi c ++. Chuỗi thứ hai được gọi là chuỗi c và chuỗi thứ nhất được gọi là chuỗi std hoặc (chuỗi c ++). Tôi sẽ đề nghị sử dụng chuỗi c ++, rất dễ xử lý.
Trong C ++ hiện đại:
std::string s("Hello world");
for (char & c : s)
{
std::cout << "One character: " << c << "\n";
c = '*';
}
Trong C ++ 98/03:
for (std::string::iterator it = s.begin(), end = s.end(); it != end; ++it)
{
std::cout << "One character: " << *it << "\n";
*it = '*';
}
Đối với phép lặp chỉ đọc, bạn có thể sử dụng std::string::const_iterator
trong C ++ 98 và for (char const & c : s)
hoặc chỉ for (char c : s)
trong C ++ 11.
auto
luôn luôn là một ý tưởng tốt. Khi sử dụng nó, sự khác biệt giữa begin()
và cbegin()
trở nên có liên quan.
char & c
) là gì? Có phải chỉ để cho phép sửa đổi giá trị ký tự trong trường hợp cần thiết?
Đây là một cách khác để làm điều đó, sử dụng thuật toán tiêu chuẩn.
#include <iostream>
#include <string>
#include <algorithm>
int main()
{
std::string name = "some string";
std::for_each(name.begin(), name.end(), [] (char c) {
std::cout << c;
});
}
const char* str = "abcde";
int len = strlen(str);
for (int i = 0; i < len; i++)
{
char chr = str[i];
//do something....
}
strlen
trong điều kiện vòng lặp, vì nó yêu cầu thao tác O (n) trên chuỗi cho mỗi lần lặp, tạo ra toàn bộ vòng lặp O (n ^ 2) trong kích thước của chuỗi. strlen
trong điều kiện vòng lặp có thể được gọi nếu chuỗi thay đổi trong vòng lặp, nhưng nên được dành riêng cho các trường hợp thực sự cần thiết .
Tôi không thấy bất kỳ ví dụ nào sử dụng phạm vi dựa trên vòng lặp với "chuỗi c".
char cs[] = "This is a c string\u0031 \x32 3";
// range based for loop does not print '\n'
for (char& c : cs) {
printf("%c", c);
}
không liên quan nhưng ví dụ mảng int
int ia[] = {1,2,3,4,5,6};
for (int& i : ia) {
printf("%d", i);
}
Đối với chuỗi C ( char []
), bạn nên làm một cái gì đó như thế này:
char mystring[] = "My String";
int size = strlen(mystring);
int i;
for(i = 0; i < size; i++) {
char c = mystring[i];
}
Để std::string
bạn có thể sử dụng str.size()
để lấy kích thước của nó và lặp lại như ví dụ hoặc có thể sử dụng một trình vòng lặp:
std::string mystring = "My String";
std::string::iterator it;
for(it = mystring.begin(); it != mystring.end(); it++) {
char c = *it;
}
for (int x = 0; x < yourString.size();x++){
if (yourString[x] == 'a'){
//Do Something
}
if (yourString[x] == 'b'){
//Do Something
}
if (yourString[x] == 'c'){
//Do Something
}
//...........
}
Chuỗi về cơ bản là một mảng các ký tự, do đó bạn có thể chỉ định chỉ mục để lấy ký tự. Nếu bạn không biết chỉ mục, thì bạn có thể lặp qua nó như mã ở trên, nhưng khi bạn thực hiện so sánh, hãy đảm bảo bạn sử dụng dấu ngoặc đơn (chỉ định một ký tự).
Ngoài ra, mã trên là tự giải thích.
bạn có thể lấy mọi char trong một chuỗi bằng cách sử dụng chức năng của thư viện chuỗi, giống như tôi đã làm như thế này
string words;
for (unsigned int i = 0; i < words.length(); i++)
{
if (words.at(i) == ' ')
{
spacecounter++; // to count all the spaces in a string
if (words.at(i + 1) == ' ')
{
i += 1;
}
đây chỉ là một đoạn mã của tôi nhưng vấn đề là bạn có thể truy cập các ký tự bằng cách stringname.at(index)
std::string
?