C ++ dizesindeki her karakter için bir for döngüsü nasıl yapabilirim?
char
, Unicode kod noktası, genişletilmiş grafik kümesi?
index
Cevaplardaki kısım için endişelenme .
C ++ dizesindeki her karakter için bir for döngüsü nasıl yapabilirim?
char
, Unicode kod noktası, genişletilmiş grafik kümesi?
index
Cevaplardaki kısım için endişelenme .
Yanıtlar:
A'nın karakterleri arasında std::string
döngü tabanlı, döngü tabanlı bir aralık kullanarak (C ++ 11'den, GCC, clang ve VC11 beta'nın son sürümlerinde zaten desteklenmektedir):
std::string str = ???;
for(char& c : str) {
do_things_with(c);
}
std::string
Yineleyiciler ile bir a karakterleri arasında döngü :
std::string str = ???;
for(std::string::iterator it = str.begin(); it != str.end(); ++it) {
do_things_with(*it);
}
std::string
Eski moda bir for döngüsü ile a'nın karakterleri arasında dolaşmak :
std::string str = ???;
for(std::string::size_type i = 0; i < str.size(); ++i) {
do_things_with(str[i]);
}
Boş sonlandırılmış karakter dizisinin karakterleri arasında geçiş yapmak:
char* str = ???;
for(char* it = str; *it; ++it) {
do_things_with(*it);
}
std::string
, bu sadece bir bayt dizisidir.
For for döngüsü şu şekilde uygulanabilir:
string str("HELLO");
for (int i = 0; i < str.size(); i++){
cout << str[i];
}
Bu, karakter dizesini karakter basar. str[i]
dizindeki karakteri döndürür i
.
Bir karakter dizisiyse:
char str[6] = "hello";
for (int i = 0; str[i] != '\0'; i++){
cout << str[i];
}
Temelde ikisinin üzerinde c ++ tarafından desteklenen iki tür dizge vardır. İkincisi c string olarak adlandırılır ve ilki std string veya (c ++ string) olarak adlandırılır. C ++ string'i kullanmanızı öneririm, kullanımı çok kolay.
Modern C ++ ile:
std::string s("Hello world");
for (char & c : s)
{
std::cout << "One character: " << c << "\n";
c = '*';
}
C ++ 98 / 03'te:
for (std::string::iterator it = s.begin(), end = s.end(); it != end; ++it)
{
std::cout << "One character: " << *it << "\n";
*it = '*';
}
Salt okunur yineleme için, std::string::const_iterator
C ++ 98'de for (char const & c : s)
veya yalnızca for (char c : s)
C ++ 11'de kullanabilirsiniz.
auto
her zaman iyi bir fikirdir. Kullanırken begin()
ve arasındaki ayrım cbegin()
önemli hale gelir.
char & c
)? Sadece gerekli olduğunda karakter değerinin değiştirilmesine izin vermek mi?
Standart algoritmayı kullanarak bunu yapmanın başka bir yolu.
#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
Döngü koşulunda kullanmak için iyi bir form olarak kabul edilmez , çünkü her bir yineleme için dizede O (n) işlemi gerektirir ve tüm döngüyü O (n) yapar. ^ 2) dize boyutunda. strlen
Döngü koşulunda, dize döngü sırasında değişirse çağrılabilir, ancak gerçekten gerekli olduğu durumlar için ayrılmalıdır .
"C string" ile döngü için bir aralık kullanarak herhangi bir örnek görmüyorum.
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);
}
ilgili değil, int dizi örneği
int ia[] = {1,2,3,4,5,6};
for (int& i : ia) {
printf("%d", i);
}
C-string ( char []
) için şöyle bir şey yapmalısınız:
char mystring[] = "My String";
int size = strlen(mystring);
int i;
for(i = 0; i < size; i++) {
char c = mystring[i];
}
İçin std::string
kullanabileceğiniz str.size()
örnekteki gibi boyutunu ve iterate almak veya bir yineleyici kullanabilirsiniz:
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
}
//...........
}
Dize temel olarak bir karakter dizisidir, bu nedenle karakteri almak için dizini belirtebilirsiniz. Dizini bilmiyorsanız, yukarıdaki kod gibi döngü yapabilirsiniz, ancak karşılaştırma yaparken tek tırnak (bir karakter belirtir) kullandığınızdan emin olun.
Bunun dışında, yukarıdaki kod açıklayıcıdır.
Bu şekilde yaptığım gibi, dize kütüphanesinin at işlevini kullanarak bir karakter dizisindeki her karakteri alabilirsiniz
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;
}
bu sadece kodumun bir parçası ama asıl önemli olan karakterlere stringname.at(index)
std::string
?