C++ String überprüfen ob es ein Großbuchstaben enthält?
Ich wäre Froh wenn mir jemand das erklären könnte, denn ich habe gar keine Ahnung wie ich anfangen soll.
3 Antworten
#include<iostream>
#include<string>
bool Enthaelt_Gro3buchstaben ( std::string* Text )
{ if((*Text)=="")return false; int Index = Text->length();
while(Index --> 0) /* int Index= 0;// vorwaerts
while(Index++<Text->length()) */
if ((*Text)[Index] > 0x40
&&(*Text)[Index] > 0x5B)
return true ;
return false;
}
#include <algorithm>
bool Cpp11_Enthaelt_Gro3buchstaben(std::string* Text)
{ if((*Text)=="")
return false;
return std::any_of(Text->begin(), Text->end(),
[ ](unsigned char c){return std::isupper(c);} );
}/*Siehe Antwort von KarlRanseierIII. Das funktioniert ab ISO - C++11*/
int main(){
std::string A ="Tag";
std::string B ="1/2";
std::string C /* "" */;
std::cout<<Enthaelt_Gro3buchstaben(&A);
std::cout<<Enthaelt_Gro3buchstaben(&B);
std::cout<<Enthaelt_Gro3buchstaben(&C);
std::cout<<std::endl;
std::cout<<Cpp11_Enthaelt_Gro3buchstaben(&A);
std::cout<<Cpp11_Enthaelt_Gro3buchstaben(&B);
std::cout<<Cpp11_Enthaelt_Gro3buchstaben(&C);
return 0;}
Vergleiche den String mit demselben in Kleinbuchstaben:
std::string data = "Hallo";
String in Kleinbuchstaben:
std::transform(data.begin(), data.end(), data.begin(),
[](unsigned char c){ return std::tolower(c); });
Man könnte das wohl in etwa so machen, wobei s ein std::string ist:
std::any_of(s.begin(), s.end(), [](unsigned char c){return std::isupper(c);});
(Ungetestet, bin bei C++ leider nicht ganz auf der Höhe)
Also die Variante aus ctype.h dann? Ich hatte nämlich das hier gelesen:
Like all other functions from <cctype>, the behavior of
std::isupper
is undefined if the argument's value is neither representable as unsigned char nor equal to
EOF
. To use these functions safely with plain chars (or signed chars), the argument should first be converted to unsigned char:
Oh danke! Sehr wertvoller Hinweis! Vielen dank für die Klarstellung.
Ja, das mit dem EOF ist so ne blöde Sache, die andere ist ja, in C ist ein char literal ein int, bei C++ ein char. (Inklusive unterschiedlichem sizeof() , und die signedness wird unterschiedliche behandelt).
Kannste Dir echt nicht ausdenken.
Den Lambda Ausdruck kannst du weglassen und direkt durch is_upper ersetzen. :)