Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben
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.

Geschrieben

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

Geschrieben
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]

Geschrieben

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?

Geschrieben (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 von Auremy
Geschrieben (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 von Auremy
Geschrieben
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.

Geschrieben

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é

Geschrieben


#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

Geschrieben

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 ;)

Geschrieben (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 von icefox
Geschrieben

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);

}

Geschrieben
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;

}

Geschrieben

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

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...