Auremy Geschrieben 19. März 2009 Geschrieben 19. März 2009 Hallo liebe Fachinformatikkollegen, ich stehe vor einem kleinen Problem: ich selber bin FiSy und eher unerfahren in C++ ich hab das Problem, das ich eine eingabe auf länge,sonderzeichen,Ziffern und Großbuchstaben prüfen will. Hab zwar so leichte ansätze krieg die aber nicht umgesetzt. z.B. länge überprüfen mit if(Eingabe>14) cout"Zu lang/n"; kann ja nicht funktionieren weil die länge der eingabe ja nicht nur aus Zahlen besteht. Bei den Sonderzeichen funktioniert das wohl mit dem Ascii-Code (Was?? Wie definier ich diese), Ziffern : hab was gelesen mit ndigit(=isdigit ..... ? 1 : 0) finde das nicht mehr klang aber plausibel, Großund klein schreibung mit Uppdercase/lowercase Das alles in nem array Ich hoffe ihr könnt mir da weiterhelfen steh nämlich voll aufem schlauch Zitieren
flashpixx Geschrieben 19. März 2009 Geschrieben 19. März 2009 Wenn es komplexere Prüfungen sind, dann wären wohl eher reguläre Ausdrücke etwas: Regulärer Ausdruck ? Wikipedia Phil Zitieren
Klotzkopp Geschrieben 19. März 2009 Geschrieben 19. März 2009 ich hab das Problem, das ich eine eingabe auf länge,sonderzeichen,Ziffern und Großbuchstaben prüfen will. Meinst du mit prüfen, ob mindestens ein Zeichen die Anforderung erfüllt, oder ob es alle tun? Und was genau sind für dich Sonderzeichen? Alles außer Buchstaben und Zahlen? Was ist mit Umlauten? Was ist mit Tabs? Grundsätzlich könntest du Zeichen für Zeichen prüfen, mit isdigit, isupper usw. Schau dir einfach mal hier die Funktionen an, deren Namen mit "is" beginnen. Zitieren
Auremy Geschrieben 19. März 2009 Autor Geschrieben 19. März 2009 welche zeichenklasse ich verwenden muss ist mir ja schon klar wie ich diese nur alle vernunftig in nem quelcode unterbringe da haperts aber schonmal danke Sonderzeichen ist alles außer zahlen und buchstaben. Umlaute Tabs und leerzeichen erstmal nicht Zitieren
Klotzkopp Geschrieben 19. März 2009 Geschrieben 19. März 2009 Wenn es komplexere Prüfungen sind, dann wären wohl eher reguläre Ausdrücke etwas: Regulärer Ausdruck ? Wikipedia Gute Idee, zumal das seit dem TR1 auch ohne externe Bibliotheken geht: #include <iostream> #include <string> #include <regex> using namespace std; using namespace std::tr1; int main() { string eingabe; getline( cin, eingabe ); cout << "Länge: " << eingabe.length() << '\n'; if( regex_search( eingabe.c_str(), regex("\\d") ) ) cout << "Enthält Zahlen\n"; if( regex_search( eingabe.c_str(), regex("[A-Z]") ) ) cout << "Enthält Großbuchstaben\n"; if( regex_search( eingabe.c_str(), regex("[^[:alnum:]]") ) ) cout << "Enthält Sonderzeichen\n"; }[/code] Zitieren
Auremy Geschrieben 19. März 2009 Autor Geschrieben 19. März 2009 Fehler 1 fatal error C1083: Datei (Include) kann nicht geöffnet werden: "regex": No such file or directory c:\dokumente und einstellungen\azubi12\eigene dateien\visual studio 2005\projects\password\password\password.cpp 7 wie krieg ich daws behoben? Zitieren
Klotzkopp Geschrieben 19. März 2009 Geschrieben 19. März 2009 Visual C++ unterstützt den TR1 erst ab Version 2008 Service Pack 1. Zitieren
Auremy Geschrieben 19. März 2009 Autor Geschrieben 19. März 2009 und wie krieg ich das unter 2005 ans laufen? Zitieren
Klotzkopp Geschrieben 19. März 2009 Geschrieben 19. März 2009 und wie krieg ich das unter 2005 ans laufen?Mit std::tr1::regex gar nicht. Setz es doch so um, wie bereits beschrieben: Mit einer Schleife die Eingabe durchgehen und die is...-Funktionen benutzen. Zitieren
Auremy Geschrieben 19. März 2009 Autor Geschrieben 19. März 2009 (bearbeitet) ok das mit der länge hab ich fast hinbekommen jedoch wenn ich 4 zeichen eingebe gibt der aus länge 3 also immer einen weniger als die tatsächliche länge habs mit +1 gelöst #include "stdafx.h" #include <iostream> #include <string> #include <locale> using namespace std; int main() { char wort; cout<<"Geben Sie ihr Wort ein"<<endl; cin>> wort; string eingabe; getline( cin, eingabe ); cout << "Laenge: " << eingabe.length()+1 << '\n'; //if( regex_search( eingabe.c_str(), regex("\\d") ) ) // cout << "Enthält Zahlen\n"; //if( regex_search( eingabe.c_str(), regex("[A-Z]") ) ) // cout << "Enthält Großbuchstaben\n"; //if( regex_search( eingabe.c_str(), regex("[^[:alnum:]]") ) ) // cout << "Enthält Sonderzeichen\n"; system("pause"); return 0; } bei den anderen sachen bin ich noch am gucken wie ich das umstelle hab die is... befehle zwar schon gefunden versuchs aber mal weiter Bearbeitet 19. März 2009 von Auremy Zitieren
Auremy Geschrieben 19. März 2009 Autor Geschrieben 19. März 2009 (bearbeitet) Hallo nochmal also ich krieg den quelltext mit isdigit und ispunct nicht die ich verwenden kann mir da jemand nochmal helfen? hab zwar rumprobiert und rumgesucht aber es klappt nix bin mit uppercase zwar was weitergekommen aber egal wieviele Großbuchstaben ich eingebe gibt der mir aus Enthält 1 Großbuchstaben int uppercase; if(uppercase=true) cout<< "Ihr Wort enthaelt "<<uppercase<<" Grossbuchstaben"<<endl; jemand ne idee Bearbeitet 19. März 2009 von Auremy Zitieren
Guybrush Threepwood Geschrieben 19. März 2009 Geschrieben 19. März 2009 if(uppercase=true) das muss == heißen, sonst weißt du uppercase den Wert true zu was 1 entspricht Zitieren
Auremy Geschrieben 19. März 2009 Autor Geschrieben 19. März 2009 mit == funktioniert das nicht da steigt mein programm aus sobald das an dieser stelle ist Zitieren
Guybrush Threepwood Geschrieben 19. März 2009 Geschrieben 19. März 2009 Dann hast du noch andere Fehler, was du willst ist aber == Zitieren
Bubble Geschrieben 19. März 2009 Geschrieben 19. März 2009 ok das mit der länge hab ich fast hinbekommen jedoch wenn ich 4 zeichen eingebe gibt der aus länge 3 also immer einen weniger als die tatsächliche länge Stimmt nicht. Die Länge Deines Strings wird korrekt ermittelt. Allerdings schreibst Du das erste Zeichen der Eingabe in ein char, anstelle es in den String einzulesen. Zitieren
AndiE Geschrieben 19. März 2009 Geschrieben 19. März 2009 Hallo Auremy, ich denke, bei dir ist ein Denkfehler drin. Einen Vergleich uppercase==0 kann es nicht geben, weil es keine Variable uppercase mit dem wertebereich BOOL oder int gibt. Erst recht nicht als Aussage, ob es in einem String Großbuchstaben gibt, oder wie viele. Der String selbst wird es dir nicht verraten. Du musst es selbst herausfinden. Du hast z.B. diese Möglichkeit: Du kannst die Zeichen im String einzeln abfragen, ob sie Zahlen sind, und das Ergebnis dann in einer Funktion GetDigits ausgeben. Mach vielleicht erstmal einen PAP o.ä., um die Funktion zu planen. LG André Zitieren
icefox Geschrieben 23. März 2009 Geschrieben 23. März 2009 #include <iostream> #include <cctype> #include <cstring> #include <string> using namespace std; int main(int argc, char* argv[]) { int i; string eingabe; char* cstr; cout << "Bitte Eingabe: "; cin >> eingabe; // Ist der String zu lang? if( eingabe.length() >= 14 ) { cout << "Die Eingabe war zu lang." << endl; return(1); } cstr = new char [eingabe.size()+1]; // Allokiere platz für C Zeichenkette plus '\0' strcpy(cstr, eingabe.c_str()); // Kopiere den C++ Stringinhalt in die C Zeichenkette // Gibt es Sonderzeichen? for( i=0; i<=eingabe.length(); i++) // Fuer jedes Zeichen in der Zeichenkette { if( 0 != ispunct( cstr[i] ) ) // Wenn ispunct != 0, dann Zeichen gefunden { cout << "Sonderzeichen " << cstr[i] << " gefunden!" << endl; return(2); } } // Gibt es Zahlen? for( i=0; i<=eingabe.length(); i++) { if( 0 != isdigit( cstr[i] ) ) { cout << "Zahl " << cstr[i] << " gefunden!" << endl; return(3); } } // Gibt es Grossbuchstaben? for( i=0; i<=eingabe.length(); i++) { if( 0 != isupper( cstr[i] ) ) { cout << "Grossbuchstabe " << cstr[i] << " gefunden!" << endl; return(4); } } cout << "Keine Beanstandung gefunden." << endl; return(0); } Hier mein Lösungsansatz. Dieser benutzt nur C++ Standard library Funktionen und ist somit mit jedem C++ compiler zu übersetzen. In dieser Aufgabe muss man mit dem Trick arbeiten, auf die C Komponenten der Zeichenkettenverarbeitung zurück zu greifen. So sind die header <cctype> und <cstring> Wrapper für die C library und helfen in solchen Situationen aus. Ich hoffe dir geholfen zu haben. Gruß, icefox Zitieren
Klotzkopp Geschrieben 24. März 2009 Geschrieben 24. März 2009 Das Umkopieren in ein char-Array ist nicht notwendig. Die Klasse std::string überlädt den operator[], du kannst also auf eingabe genauso mit isdigit & Co. zugreifen wie auf die Elemente eines char-Arrays. Zudem wirst du so das Speicherleck wieder los Zitieren
Auremy Geschrieben 24. März 2009 Autor Geschrieben 24. März 2009 Ja super funktioniert nachdem ich return(1;2;3;4) rausgenommen hab vielen dank Zitieren
icefox Geschrieben 24. März 2009 Geschrieben 24. März 2009 (bearbeitet) Hallo Klotzkopp, ah, gut zu sehen. Und wieder was dazu gelernt! Vielen Dank! #include <iostream> #include <cctype> #include <cstring> #include <string> using namespace std; int main(int argc, char* argv[]) { unsigned char i; string eingabe; cout << "Bitte Eingabe: "; cin >> eingabe; // Ist der String zu lang? if( eingabe.length() >= 14 ) { cout << "Die Eingabe war zu lang." << endl; return(1); } // Gibt es Sonderzeichen? for( i=0; i<=eingabe.length(); i++) // Fuer jedes Zeichen in der Zeichenkette { if( 0 != ispunct( eingabe[i] ) ) // Wenn ispunct != 0, dann Zeichen gefunden { cout << "Sonderzeichen " << eingabe[i] << " gefunden!" << endl; return(2); } } // Gibt es Zahlen? for( i=0; i<=eingabe.length(); i++) { if( 0 != isdigit( eingabe[i] ) ) { cout << "Zahl " << eingabe[i] << " gefunden!" << endl; return(3); } } // Gibt es Grossbuchstaben? for( i=0; i<=eingabe.length(); i++) { if( 0 != isupper( eingabe[i] ) ) { cout << "Grossbuchstabe " << eingabe[i] << " gefunden!" << endl; return(4); } } cout << "Keine Beanstandung gefunden." << endl; return(0); } grüßlis, icefox Bearbeitet 24. März 2009 von icefox Zitieren
AndiE Geschrieben 24. März 2009 Geschrieben 24. März 2009 Hallo, ich habe diesen Vorschlag. Er macht zwar das selbe, aber die Hauptfunktion ist in Unterfunktionen gegliedert. Nach meiner Erfahrung läßt sich das Programm so besser übersehen. Mir ist das aus "C" zumindest so bekannt. LG André #include <iostream> #include <cctype> #include <cstring> #include <string> using namespace std; void Sonder( string eingabe) { int i; for( i=0; i<=eingabe.length(); i++) // Fuer jedes Zeichen in der Zeichenkette { if( 0 != ispunct( eingabe[i] ) ) // Wenn ispunct != 0, dann Zeichen gefunden { cout << "Sonderzeichen " << eingabe[i] << " gefunden!" << endl; } } } void Zahlen(string eingabe) { int i; for( i=0; i<=eingabe.length(); i++) { if( 0 != isdigit( eingabe[i] ) ) { cout << "Zahl " << eingabe[i] << " gefunden!" << endl; } } } void Gross(string eingabe) { int i; for( i=0; i<=eingabe.length(); i++) { if( 0 != isupper( eingabe[i] ) ) { cout << "Grossbuchstabe " << eingabe[i] << " gefunden!" << endl; } } } int main(int argc, char* argv[]) { unsigned char i; string eingabe; cout << "Bitte Eingabe: "; cin >> eingabe; // Ist der String zu lang? if( eingabe.length() >= 14 ) cout << "Die Eingabe war zu lang." << endl; else { // Gibt es Sonderzeichen? Sonder(eingabe); // Gibt es Zahlen? Zahlen(eingabe); // Gibt es Grossbuchstaben? Gross(eingabe); } cout << "Pruefung beendet" << endl; cin >> i; return(0); } Zitieren
TDM Geschrieben 24. März 2009 Geschrieben 24. März 2009 Hallo, ich habe diesen Vorschlag. Er macht zwar das selbe, aber die Hauptfunktion ist in Unterfunktionen gegliedert. Nach meiner Erfahrung läßt sich das Programm so besser übersehen. Mir ist das aus "C" zumindest so bekannt. Wenn wir schon bei Code-Optimierungen sind, dann will ich auch meinen Senf dazugeben: Ich würde den Sub-Funktionen nicht den kompletten String als Parameter übergeben, sondern diese als einzeilen wrapper (oder komplett weglassen), damit die Zeichen im String nicht mehrfach iteriert werden müssen. (Ist bei einer begrenzten Länge unbedeutend, kann aber bei längeren Strings erheblich dauern) #include "stdafx.h" #include <iostream> #include <cctype> #include <cstring> #include <string> using namespace std; bool isdigit(char c) { return ((c >= 0x30) && (c <= 0x39)); } bool isUpper(char c) { return ((c >= 0x41) && (c <= 0x5A)); } int main(int argc, char* argv[]) { unsigned char i; string eingabe; cout << "Bitte Eingabe: "; cin >> eingabe; // Ist der String zu lang? if( eingabe.length() >= 14 ) cout << "Die Eingabe war zu lang." << endl; else { for(int i = 0; i<eingabe.length(); i++) if (isdigit(eingabe[i])) cout << "isdigit returns true at " << i << "(" << eingabe[i] << ")" << endl; else if(isUpper(eingabe[i])) cout << "isUpper returns true at " << i << "(" << eingabe[i] << ")" << endl; } cout << "Pruefung beendet" << endl; cin >> i; return 0; } Zitieren
icefox Geschrieben 24. März 2009 Geschrieben 24. März 2009 Meine Herren, (und natürlich Damen, falls anwesend) es handelt sich nicht im einen Schönheitswettbewerb, sondern um Proof of Concept Code. ( Nur damit ich auch mal meine Meinung gesagt habe, ohne das es jemanden interessiert. Ja, trollen macht Spaß. Gruß, icefox Zitieren
AndiE Geschrieben 24. März 2009 Geschrieben 24. März 2009 Meine Herren, (und natürlich Damen, falls anwesend) es handelt sich nicht im einen Schönheitswettbewerb, sondern um Proof of Concept Code. ... in einem "Pogrammier"-Forum. Deshalb wollte ich zeigen, dass man ein komplexeres Problem in Teilprobleme auflösen kann, die dann von der Hauptfunktion main() als Unterprogramme aufgerufen werden. Erstmal steigert das die Übersichtlichkeit und die erstellten Funktionen können gegebenenfalls in anderen Anwendungen weiterverwendet werden können. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.