[C] - Leerzeichen/Buchstaben aus String entfernen...

SuumDaHead

Mitglied
Hi ich hab schon wieder ein Problem :(, entschuldige das ich euch zurzeit so belaste aber ihr seit meine letzte Rettung für die Klausur..

Meine Aufgabe war, dass ich aus einem String alle Zeichen entferne, sodass nur noch die Ziffern übrig bleiben:

hier mal mein Code:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void nurZiffern(char *str);

int main()
{
	char str1[20] = "11 X F4 42 Gxb";
	nurZiffern(str1);
	puts(str1);   
	
	system("pause");
	return 0;
}

void nurZiffern(char *str)
{
	int i, j=0;

	for(i=0; i <= strlen(str); i++)
	{
		str[j] = str[i];

		if(str[i] != ' ' && str[i] != 'F' && str[i] != 'X')
             //if(str[i] != ' ' && str[i] >= 'A'  && str[i] <= 'z')
			j++;
	}
	str[j] = '\n';
	
}

wenn ich ihn mit der 1. if-Schleife laufen lasse, funktioniert es ja, dass die Leerzeichen, das F und das x weg sind....
allerdings wenn ich die zweite laufen lasse, funktioniert das ganze nicht so wie gewünscht...

Ich sag doch in meiner If-Bedingung, dass er solange weiter laufen soll bis er Leerzeichen hat oder nen Buchstaben zw. A und z ?

danke schonmal wieder für eure Geduld mit mir und eurer Hilfe******
mfg summi
 
Hi,

ich glaube ich würde die Aufgabe etwas anders angehen. Du sollst ja alle Zeichen, bis auf die Ziffern entfernen, also würde ich mir wahrscheinlich einen neuen String in deiner Funktion "nurZiffern" anlegen, dann in einer Schleife über "str" gehen und alle Ziffern, aus "str" in den neuen String kopieren und diesen von der Funktion zurück liefern lassen.

So wie dein Ansatz jetzt aussieht musst du ja für jeden Buchstaben eine neue if Abfrage einbauen (nebenbei, if ist keine Schleife, sonder nur eine Abfrage).
 
Hallo SuumDaHead

Die Abfrage:
C++:
if(str[i] != ' ' && str[i] >= 'A'  && str[i] <= 'z')

geht bei den Buchstaben den falschen Weg. Du willst j zum nächsten Buchstaben bewegen wenn es kein Leerzeichen und kein Buchstabe ist. Aktuell bewegst du j weiter wenn str[i] kein Leerzeichen ist oder wenn es ein Buchstabe ist. Ergo entfernt es Leerzeichen und Zahlen. Bei den Buchstaben musst du das Gegenteil abfragen:
C++:
if(str[i] != ' ' && !(str[i] >= 'A'  && str[i] <= 'z'))

Bezüglich Buchstabenabfrage:
Im Bereich 'A' bis 'z' sind auch die Zeichen [ ] \ ^ _ und ` drin. All diese würden also auch entfernt.

Grüsse
Cromon
 
danke Cromon, so einfach wäre es gewesen.... :)

dennoch versuch ich jetzt auch mal die Vorgehensweise, welche DER WOLF noch vorgeschlagen hat
 
Hi,

ich sehe gerade, dass ich auch einen Denkfehler hatte. Du hast ja schon einen Ausschluss über ganze Bereiche gemacht und nicht nur einzelner Buchstaben. Das ist vom Ansatz her wohl noch eleganter als mein Vorschlag.

Gruß,
Der Wolf
 
Hi,

ich sehe gerade, dass ich auch einen Denkfehler hatte. Du hast ja schon einen Ausschluss über ganze Bereiche gemacht und nicht nur einzelner Buchstaben. Das ist vom Ansatz her wohl noch eleganter als mein Vorschlag.

Gruß,
Der Wolf


macht ja nix... ich bin noch über deinen Lösungsvorschlag, komm aber jetzt nicht weiter, weil ich nicht weiß was ich schreiben muss, dass der jetzt nur die Zahlen kopieren soll:

hier mal mein Ansatz
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void nurZiffern(char *str);

int main()
{
	char str1[20] = "11 X F4 42 Gxb";
	nurZiffern(str1);
	puts(str1);
	
	system("pause");
	return 0;
}

void nurZiffern(char *str)
{
	int i, j=0;

        char nurZiffern[100];

	for(i=0; i <= strlen(str); i++)
	{
              if(str[i] >=  '0' && str[i] <= '9')
			
                    nurZiffern[i] = ****?
	}
	
        return ****?
	
}

also einmal weiß ich hier jetzt nicht weiter und zweites ist das wenn ich doch nen String zurückgeben lassen will, muss ich doch den Rückgabetyp in Char ändern oder ? aber das geht ja nicht zeigt mir VS an ?
 
Hallo Wolf,

deinen grundsätzlichen Ansatz, nur auf die zu behaltenden Zeichen zu testen, finde ich besser, als alle anderen in der Hoffnung zu prüfen, dass dann die richtigen übrigbleiben.

Gruß
MCoder
 
Hi.

Es gibt übrigens eine Standardfunktion namens isdigit.

Grundsätzliche Vorgehensweise ohne zusätzlichen Speicher zu verwenden:

1. erstes Zeichen im String suchen welches !isdigit ist, Index merken (idx)

2. nächstes Zeichen suchen welches isdigit ist

3. dieses Zeichen an die Stelle (idx) kopieren

4. idx inkrementieren, mit Schritt 2. weitermachen
 
Danke für die Blumen, MCoder. :)

Wenn deine Funktion den zurück geben soll, dann musst den Rückgabewert auf char* statt auf void setzen und dann das Array nurZiffern auch als Pointer behandeln, dann kannst du es zurück geben.

Also
C:
 char *nurZiffern = (char*) calloc(100, sizeof(char));
falls du C benutzt, und
C++:
 char *nurZiffern = new char[100];
falls du C++ benutzt. Sollte beides gehen. Dann kannst du mit
C:
 return nurZiffern
das Array zurückgeben. Aber nicht vergessen den Speicher mit delete oder free wieder am Ende der main Methode frei zu geben.

Mit dem Array selbst kannst du genauso arbeiten wie zuvor auch. Das heisst
C:
 nurZiffern[i] = 'X'
geht immernoch. Du musst dir jetzt eigentlich nur noch eine Zähl-Variable anlegen, die dir sagt an welcher Stelle in dem Array "nurZiffern" du bist und dann der Stelle fügst du dann die Zahl aus "str" ein.

Und am der Funktion "nurZiffern" nicht vergessen wieder den terminierenden 0 Charakter für den String zu setzen.

Gruß,
Wolf
 
Zuletzt bearbeitet von einem Moderator:
sry aber hab ez voll den hänger, weiß einfach net wie ich des mit der zählvariblen machen soo ... verdammnt kann doch net sein... hier mal der code wieder mit deinen oben genannten sachen

Code:
char* nurZiffern(char *str);

int main()
{
	char str1[20] = "11 X F4 42 Gxb";
	nurZiffern(str1);
	puts(str1);
	
	system("pause");
	return 0;
}

char *nurZiffern(char *str)
{
	int i, j=0;
	char *nurZiffern = (char*) calloc(100, sizeof(char));
	

	for(i=0; i <= strlen(str); i++,j++)
	{
		  if(str[i] >=  '0' && str[i] <= '9')
            nurZiffern[j] = str[i];	
	}
	
	
	return nurZiffern;
}
 

Neue Beiträge

Zurück