Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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.

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

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]

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?

und wie krieg ich das unter 2005 ans laufen?

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

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

mit == funktioniert das nicht da steigt mein programm aus sobald das an dieser stelle ist

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.

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é


#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

Ja super funktioniert nachdem ich return(1;2;3;4) rausgenommen hab vielen dank

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

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

}

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;

}

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

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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.