prüfen, ob ein String ein bestimmten Buchstaben enthält

Sandra92

Grünschnabel
Hallo,

ich bin totaler C Anfänger und habe ein Problem mit meinen If-Abfragen (denke ich)
Mein Ziel ist es von einem eingegebenen String zu überprüfen ob 'a', 'b' und 'c' enthalten sind.

Dies ist mein Code-Versuch :)
C++:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main (void)
{

int i;

char string[4];
printf("Geben Sie eine Zeichenkette ein : ");
scanf("%d\n", &string);
for (i = 0; string != '\0'; i++){
	if (string[0] == 'a')
	{
	printf("Der String enthält ein a");
	break;
	}
	else if (string[i] == 'b')
	{
	printf("der String enthält ein b");
	break;
	}
	else if (string[i] == 'c')
	{
	printf("der String enthält ein c");
	break;
	}
	else
	{
	printf("Der String enhält weder ein a, b noch ein c");
	break;
	}
}
return 0;

}

was habe ich falsch gemacht?
Danke schon mal im Voraus :)

Eure Sandi
 
Zuletzt bearbeitet:
Hi und Willkommen bei tutorials.de,

Dein String kann nur 3 Zeichen aufnehmen (mit der \0 als Schlusszeichen am Ende 4).
Ist das beabsichtigt?
Auch wenn: Man sollte absichern, was passiert, wenn mehr eingegeben werden.
Wenn man das nicht prüft/verhindert bekommt man schon unerklärbare Programmfehler,
falls was zu Langes eingegeben wird.
Also ggf. den String größer machen (zB. [100] statt [4])
und statt scanf zB. fgets verwenden.
scanf macht sich nämlich nicht viel aus Maximallängen, fgets schon.
Anwendung ein paar Zeilen weiter unten.

Nächstes Problem: %d bei scanf liest Zahlen ein. Für int´s.
Das passt so nicht in die Variable string, auch eine Quelle für unerklärbare Probleme.
Abhilfe: %s statt %d nehmen, oder gleich fgets.
(fgets kann nur Strings, also kein %d oder so. Nur %s-Artiges.
%d etc. sind hier aber auch nicht nötig).
Verwendung fgets:
C++:
fgets(string, 4, stdin);
4 steht für die Maximallänge. Wenn oben angepasst, dann auch hier größer angeben.
stdin steht für die Tastatur (alternativ könnte fgets
auch aus Dateien auslesen, die hier angegeben werden).

Bei der Bedingung der for-Schleife gehört string[i] statt string.
Es soll ja geprüft werden, ob das aktuelle Zeichen das Ende ist,
nicht, ob der gesamte String ein Ende ist :suspekt:
(wie kompilierst du das eigentlich, dass du keine Warnungen bekommst?)

Beim ersten if im for gehört string[i] statt string[0].

Die break´s bei den if´s müssen weg.
Sobald eines davon gemacht wird wird die for-Schleife vorzeitig abgebrochen.
Auch ohne abc wird ja eins der if´s gemacht (das Letzte), und dann ist dort aus.
Nach dem ersten Zeichen (also [0]) wird mit break´s in jedem Fall aufgehört.

Und das mit dem "weder ein a, b noch ein c" muss anders gemacht werden.
So würde nämlich bei jedem Zeichen, dass nicht abc ist, die Meldung ausgegeben werden.
"Hallo" ergibt dann ca.

Weder a/b/c
Enthält a
Weder a/b/c
Weder a/b/c
Weder a/b/c

Mach zB. eine Variable, die am Anfang auf 0 ist.
Wenn in der Schleife ein a/b/c gefunden wird, auf 1 setzen.
Und erst nach der Schleife dann schauen, ob 1 oder 0 ist,
und bei 0 die Nichts-gefunden-Meldung ausgeben.

Gruß
 
Hi.

Es gibt übrigens schon eine Standardfunktion, die ermittelt ob ein Zeichen in einem String enthalten ist: strchr.

Falls du die nicht verwenden kannst, wäre es am sinnvollsten diese Funktion selbst zu implementieren; so vermeidest du unnötig komplexen Code in der Schleife.

Gruß
 
Vielen lieben Dank für euer Bemühen , sehr lieb von euch <3

nur habe ich noch eine Frage an sheel.

Könntest du mir bitte dazu ein Beispiel geben?



Mach zB. eine Variable, die am Anfang auf 0 ist.
Wenn in der Schleife ein a/b/c gefunden wird, auf 1 setzen.
Und erst nach der Schleife dann schauen, ob 1 oder 0 ist,
und bei 0 die Nichts-gefunden-Meldung ausgeben.



der Rest hat optimal funktioniert und vielen Dank für die Erklärungen
 
So ca.:
C++:
int gefunden = 0;
...
for (i = 0; string[i] != '\0'; i++)
{
	if (string[i] == 'a')
	{
		printf("Der String enthält ein a");
		gefunden = 1;
	}
	else if (string[i] == 'b')
	{
		printf("der String enthält ein b");
		gefunden = 1;
	}
	else if (string[i] == 'c')
	{
		printf("der String enthält ein c");
		gefunden = 1;
	}
}

if(gefunden == 0)
{
	printf("Der String enhält weder ein a, b noch ein c");
}

Nur so nebenbei, die if´s in der Schleife könnte man zusammenfassen:
C++:
int gefunden = 0;
...
for (i = 0; string[i] != '\0'; i++)
{
	if (string[i] >= 'a' && string[i] <= 'c')
	{
		printf("Der String enthält ein %c", string[i]);
		gefunden = 1;
	}
}

if(gefunden == 0)
{
	printf("Der String enhält weder ein a, b noch ein c");
}
Code etwas kürzer, sonst gleich.

Gruß
 
Wahnsinn :D
ich hätte nie gedacht, dass man so schnell eine Antwort bekommt..

Vielen Dank, nur wenn ich jetzt Sandra eingebe
kommt raus:

der String enthält weder ein a, b noch ein c
der String enthält ein a
der String enthält ein a


kann ich die erste Zeile also "der String enthält weder ein a, b noch ein c " dann gar nicht vermeiden oder?
 
C++:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main (void)
{

int i;
int gefunden = 0;
char string[100];
printf("Geben Sie eine Zeichenkette ein : ");
scanf("%s\n", &string);
for (i = 0; string[i] != '\0'; i++){
	if (string[i] == 'a')
	{
	printf("Der String enthält ein a\n");
	gefunden = 1;
	}
	else if (string[i] == 'b')
	{
	printf("der String enthält ein b\n");
	gefunden = 1;
	}
	else if (string[i] == 'c')
	{
	printf("der String enthält ein c\n");
	gefunden = 1;
	}
 if (gefunden == 0)
	{
	printf("Der String enhält weder ein a, b noch ein c\n");
	
	}
}
return 0;

}
 
Zuletzt bearbeitet von einem Moderator:
Das
C++:
if (gefunden == 0)
{
    printf("Der String enhält weder ein a, b noch ein c\n");
}
gehört aus dem Schleifenbereich raus, nach dem kompletten for-Block.

Zuerst wird auf a/b/c untersucht und ggf. "notiert", dass eines vorgekommen ist.
Am Schluss, nach der Schleife, wird dann die Nichts-gefunden-Meldung ausgegeben,
wenn kein Fund notiert wurde.

PS: Codeblöcke wie in deinen Beiträgen bitte zwischen
[code=cpp] hier der code [/code]
schreiben. Siehst ja, wie das dann ausschaut.
 

Neue Beiträge

Zurück