Wie würde ich eine for-Schleife für jedes Zeichen in einer Zeichenfolge in C ++ durchführen?
char
, Unicode-Codepunkt, erweiterter Graphemcluster?
index
Teil in den Antworten.
Wie würde ich eine for-Schleife für jedes Zeichen in einer Zeichenfolge in C ++ durchführen?
char
, Unicode-Codepunkt, erweiterter Graphemcluster?
index
Teil in den Antworten.
Antworten:
Durchlaufen der Zeichen von a std::string
mithilfe einer bereichsbasierten for-Schleife (stammt aus C ++ 11 und wird bereits in neueren Versionen von GCC, clang und der VC11-Beta unterstützt):
std::string str = ???;
for(char& c : str) {
do_things_with(c);
}
Durchlaufen der Zeichen eines std::string
mit Iteratoren:
std::string str = ???;
for(std::string::iterator it = str.begin(); it != str.end(); ++it) {
do_things_with(*it);
}
Durchlaufen der Zeichen eines std::string
mit einer altmodischen for-Schleife:
std::string str = ???;
for(std::string::size_type i = 0; i < str.size(); ++i) {
do_things_with(str[i]);
}
Durchlaufen der Zeichen eines nullterminierten Zeichenarrays:
char* str = ???;
for(char* it = str; *it; ++it) {
do_things_with(*it);
}
std::string
, die nur eine Reihe von Bytes.
Eine for-Schleife kann folgendermaßen implementiert werden:
string str("HELLO");
for (int i = 0; i < str.size(); i++){
cout << str[i];
}
Dadurch wird die Zeichenfolge zeichenweise gedruckt. str[i]
Gibt das Zeichen am Index zurück i
.
Wenn es sich um ein Zeichenarray handelt:
char str[6] = "hello";
for (int i = 0; str[i] != '\0'; i++){
cout << str[i];
}
Grundsätzlich gibt es über zwei Arten von Zeichenfolgen, die von c ++ unterstützt werden. Die zweite heißt c string und die erste heißt std string oder (c ++ string). Ich würde vorschlagen, c ++ string zu verwenden, sehr einfach zu handhaben.
In modernem C ++:
std::string s("Hello world");
for (char & c : s)
{
std::cout << "One character: " << c << "\n";
c = '*';
}
In C ++ 98/03:
for (std::string::iterator it = s.begin(), end = s.end(); it != end; ++it)
{
std::cout << "One character: " << *it << "\n";
*it = '*';
}
Für schreibgeschützte Iterationen können Sie std::string::const_iterator
in C ++ 98 und for (char const & c : s)
oder nur for (char c : s)
in C ++ 11 verwenden.
auto
ist immer eine gute Idee. Bei der Verwendung wird die Unterscheidung zwischen begin()
und cbegin()
relevant.
char & c
)? Ist es nur so, dass der Zeichenwert für den Fall geändert werden kann, dass er benötigt wird?
Hier ist eine andere Möglichkeit, den Standardalgorithmus zu verwenden.
#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
in der Schleifenbedingung wird nicht als gute Form angesehen , da für jede Iteration eine O (n) -Operation für die Zeichenfolge erforderlich ist, wodurch die gesamte Schleife zu O (n) wird ^ 2) in der Größe der Zeichenfolge. strlen
in der Schleife Bedingung kann aufgerufen werden, wenn sich die Zeichenfolge während der Schleife ändert, sollte jedoch für die Fälle reserviert werden, in denen sie tatsächlich erforderlich ist .
Ich sehe keine Beispiele für die Verwendung eines Bereichs, der auf einer Schleife mit einer "c-Zeichenfolge" basiert.
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);
}
nicht verwandt, aber int Array Beispiel
int ia[] = {1,2,3,4,5,6};
for (int& i : ia) {
printf("%d", i);
}
Für C-string ( char []
) sollten Sie ungefähr Folgendes tun:
char mystring[] = "My String";
int size = strlen(mystring);
int i;
for(i = 0; i < size; i++) {
char c = mystring[i];
}
Für std::string
können Sie mit str.size()
seiner Größe und Iterierte wie das Beispiel bekommen, oder könnte einen Iterator verwenden , um:
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
}
//...........
}
Ein String ist im Grunde ein Array von Zeichen. Daher können Sie den Index angeben, um das Zeichen abzurufen. Wenn Sie den Index nicht kennen, können Sie ihn wie den obigen Code durchlaufen. Wenn Sie jedoch einen Vergleich durchführen, stellen Sie sicher, dass Sie einfache Anführungszeichen verwenden (die ein Zeichen angeben).
Davon abgesehen ist der obige Code selbsterklärend.
Sie können jedes Zeichen in einem String erhalten, indem Sie die at-Funktion der String-Bibliothek verwenden, so wie ich es gemacht habe
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;
}
Dies ist nur ein Teil meines Codes, aber der Punkt ist, dass Sie auf Zeichen zugreifen können, indem Sie stringname.at(index)
std::string
?