ฉันจะทำ for loop กับตัวละครทุกตัวใน string ใน C ++ ได้อย่างไร
char
, จุดโค้ด Unicode, คลัสเตอร์กราฟที่ขยายเพิ่มเติม?
index
คำตอบ
ฉันจะทำ for loop กับตัวละครทุกตัวใน string ใน C ++ ได้อย่างไร
char
, จุดโค้ด Unicode, คลัสเตอร์กราฟที่ขยายเพิ่มเติม?
index
คำตอบ
คำตอบ:
วนลูปผ่านตัวอักษรของ a std::string
โดยใช้ช่วงสำหรับลูป (มาจาก C ++ 11 ได้รับการสนับสนุนใน GCC, clang และ VC11 เบต้าล่าสุดแล้ว:
std::string str = ???;
for(char& c : str) {
do_things_with(c);
}
วนลูปผ่านตัวอักษรของ a std::string
ด้วยตัววนซ้ำ:
std::string str = ???;
for(std::string::iterator it = str.begin(); it != str.end(); ++it) {
do_things_with(*it);
}
วนลูปผ่านตัวอักษรของ a std::string
พร้อมกับวนลูปแบบเก่า:
std::string str = ???;
for(std::string::size_type i = 0; i < str.size(); ++i) {
do_things_with(str[i]);
}
วนลูปผ่านตัวอักขระของอาร์เรย์อักขระที่สิ้นสุดด้วยค่า null:
char* str = ???;
for(char* it = str; *it; ++it) {
do_things_with(*it);
}
std::string
ซึ่งเป็นเพียงจำนวนไบต์
ห่วงสำหรับสามารถนำมาใช้เช่นนี้:
string str("HELLO");
for (int i = 0; i < str.size(); i++){
cout << str[i];
}
นี้จะพิมพ์ตัวอักษรสตริงโดยตัวละคร ผลตอบแทนที่ได้ตัวละครที่ดัชนีstr[i]
i
ถ้าเป็นอาร์เรย์อักขระ:
char str[6] = "hello";
for (int i = 0; str[i] != '\0'; i++){
cout << str[i];
}
โดยทั่วไปแล้วทั้งสองประเภทคือสตริงสองประเภทที่ c ++ รองรับ อย่างที่สองเรียกว่า c string และอันแรกเรียกว่า std string หรือ (c ++ string) ผมขอแนะนำให้ใช้สตริง c ++ ง่ายมากที่จะจัดการ
ในปัจจุบัน C ++:
std::string s("Hello world");
for (char & c : s)
{
std::cout << "One character: " << c << "\n";
c = '*';
}
ใน C ++ 98/03:
for (std::string::iterator it = s.begin(), end = s.end(); it != end; ++it)
{
std::cout << "One character: " << *it << "\n";
*it = '*';
}
สำหรับการวนซ้ำแบบอ่านอย่างเดียวคุณสามารถใช้std::string::const_iterator
ใน C ++ 98 และfor (char const & c : s)
หรือเพียงแค่for (char c : s)
ใน C ++ 11
auto
เป็นความคิดที่ดีเสมอ เมื่อใช้งานความแตกต่างระหว่างbegin()
และcbegin()
เกี่ยวข้องกัน
char & c
) คืออะไร? มันเป็นเพียงเพื่อให้การปรับเปลี่ยนค่าตัวละครในกรณีที่จำเป็นหรือไม่
นี่เป็นอีกวิธีในการทำโดยใช้อัลกอริธึมมาตรฐาน
#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
ในสภาพลูปเนื่องจากต้องใช้การดำเนินการ O (n) บนสตริงสำหรับการวนซ้ำแต่ละครั้งทำให้ทั้งลูป O (n) ^ 2) ขนาดของสตริง strlen
ในสภาพที่ห่วงสามารถเรียกได้ว่าถ้าสตริงที่มีการเปลี่ยนแปลงในช่วงห่วง แต่ควรจะสงวนไว้สำหรับกรณีที่มันเป็นจริงที่จำเป็น
ฉันไม่เห็นตัวอย่างใด ๆ โดยใช้ช่วงสำหรับลูปด้วย "c string"
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);
}
ไม่เกี่ยวข้อง แต่เป็นตัวอย่างของอาร์เรย์
int ia[] = {1,2,3,4,5,6};
for (int& i : ia) {
printf("%d", i);
}
สำหรับ C-string ( char []
) คุณควรทำสิ่งนี้:
char mystring[] = "My String";
int size = strlen(mystring);
int i;
for(i = 0; i < size; i++) {
char c = mystring[i];
}
เพื่อให้std::string
คุณสามารถใช้str.size()
เพื่อรับขนาดและวนซ้ำตามตัวอย่างหรือใช้ตัววนซ้ำ:
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
}
//...........
}
สตริงนั้นเป็นอาร์เรย์ของอักขระดังนั้นคุณสามารถระบุดัชนีเพื่อรับอักขระ หากคุณไม่รู้จักดัชนีคุณสามารถวนดูได้เหมือนโค้ดด้านบน แต่เมื่อคุณทำการเปรียบเทียบตรวจสอบให้แน่ใจว่าคุณใช้เครื่องหมายคำพูดเดี่ยว (ซึ่งระบุอักขระ)
นอกจากนั้นรหัสข้างต้นเป็นคำอธิบายด้วยตนเอง
คุณสามารถรับอักขระทุกตัวในสตริงได้โดยใช้ฟังก์ชั่น at ของไลบรารีสตริงเหมือนที่ฉันทำเช่นนี้
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;
}
นี่เป็นเพียงส่วนหนึ่งของรหัสของฉัน แต่ประเด็นคือคุณสามารถเข้าถึงตัวอักษรได้ stringname.at(index)
std::string
?