stringfunktionen mit Pointern

Puepue

Komplett-PC-Aufrüster(in)
Hallo zusammen,
als Hausaufgabe sollen wir die Funktionen
strcmp(), strcat(), strcpy() und strncpy() mit Pointern schreiben.

strcmp ist dabei ja kein Problem .. bei strcat verstehe ich allerdings nicht wie das gehen soll.. hat da jemand einen Denkanstoß für mich?

PS: Über einen Tipp bei strncpy wäre ich auch sehr dankbar ^^
 
Zuletzt bearbeitet:
Ungefähr so:

  • strcat:
    • Länge des ersten Strings ermitteln
    • Ziel-Pointer auf Start des ersten Strings + Länge des ersten Strings
    • vom Start bis zum Ende des zweiten Strings Kopieren jedes Bytes auf Ziel-Pointer und Inkrementierung Ziel-Pointer
  • strncpy:
    • wie strcpy, jedoch abbrechen, wenn Ende des Quell-Strings oder Anzahl der zu kopierenden Bytes erreicht
 
Irgendwie verstehe ich nicht wie ich an die 1. Variable anknüpfe.. ich muss ja quasi das \0 überschreiben.. aber wenn ich adresse 1 + länge variable 1 rechne komme ich ja auf die adresse der 2. Variable

und wenn ich das dann -1 rechne bin ich wieder bei der Adresse der 1. Variable
wenn ich aber -0.25 rechne bekomme ich logischerweise nur eine Fehlermeldung (es geht um C++, falls das relevant ist)
 
Die Länge eines Strings ist definiert als die Länge ohne Null-Char, also bei Hallo\0 wäre das 5.
ptr[0] = 'H';
ptr[1] = 'a';
...
ptr[4] = 'o';
ptr[5] = '\0';

Beispiel strlen:
Code:
int strlen(char *c)
{
    int cnt = 0;
    while (*c != '\0')
    {
        ++c;
        ++cnt;
     }

     return cnt;
}
Das Teil da oben ist aber ziemlich unsicher und nicht optimiert (aber schnell programmiert^^)
 
Irgendwie verstehe ich nicht wie ich an die 1. Variable anknüpfe.. ich muss ja quasi das \0 überschreiben.. aber wenn ich adresse 1 + länge variable 1 rechne komme ich ja auf die adresse der 2. Variable

und wenn ich das dann -1 rechne bin ich wieder bei der Adresse der 1. Variable
wenn ich aber -0.25 rechne bekomme ich logischerweise nur eine Fehlermeldung (es geht um C++, falls das relevant ist)

Die Pointer sind nur Zeiger, nicht die Datenbereiche !

Also Nutzung von strcat:

- aufrufende Funktion mit character arrays:

char dstarray[128]="destination", appendarray[128]="append";

strcat(dstarray, appendarray);

-> an die Funktion werden nur die Start-Adressen der Arrays übergeben, nicht die kompletten Arrays !

Innerhalb der strcat-Funktion kann man dann mit den Zeigern arbeiten, also relativ zum Start der im übergeordneten Programm definierten Arrays. Wichtig ist deshalb z.B. im aufrufenden Programm beim strcat, dass das Ziel-Array groß genug ist, um die Daten aufzunehmen.
 
Am einfachsten wäre es ja so zu machn(Wäre neugirieg was er dann sagt):
strcmpP(a, b)
{
strcmp(*a, *b);
}
...
Nur lernt man halt nichts und das ist ja der eigentliche Sinn von Hausaufgaben
strcmp(), strcat(), strcpy() und strncpy()
 
Am einfachsten wäre es ja so zu machn(Wäre neugirieg was er dann sagt):
strcmpP(a, b)
{
strcmp(*a, *b);
}
...
Nur lernt man halt nichts und das ist ja der eigentliche Sinn von Hausaufgaben
strcmp(), strcat(), strcpy() und strncpy()

So würde das aber schief gehen, da an den strcmp-Aufruf in strcmpP der Wert (der je nach Adresslänge zwei oder vier ersten Zeichen) der Zeiger a und b übergeben wird. Das ist ein typisches Beispiel , wie man einen Buffer-Overflow erzeugen kann, da aus dem Inhalt ein Zeiger in einen unzulässigen Adressraum erzeugt wird. Bei Vergleichen von Strings ist das relativ unkritisch, da keine Daten kopiert werden, bei strcpy wird es dann schon kribbelig. Allerdings kann es z.B. beim Vergleichen etwas länger dauern, da der Vergleich bis zum ersten Null-Byte ('\0') ab der (fehlerhaften) Startadresse des ersten Parameters läuft und der Zeiger wahrscheinlich irgendwo in den Code- und nicht in den Datenbereich zeigt.

Korrekt wäre es so:

int strcmpP(char *a, char *b)
{
return(strcmp(a, b));
}
 
Also für strcat habe ich mal nach einer Beispiellösung gefragt (ist jetzt keine Musterlösung):
Code:
/*****************************************************************************
Funktionsname:	strcatNew
Parameter:		second: char *
				first: char *
Beschreibung:	erzeugt einen neuen C-String, der aus der Verkettung von 
	first und second entsteht
	der Speicherplatz muss per delete[] wieder frei gegeben werden 
******************************************************************************/
char * strcatNew(char *first, char * second);
//============================================


und die eigentliche funktion
Code:
//------------------------------------------------------------------
char * strcatNew(char *first, char *second)
{
	int len = (int) strlen(first)+(int) strlen(second) + 1;
	char *result = new char [len];
	char *hp=result;
 
	//folgendes ist fast schon schlechter stil aber schön kurz
	while (*first)
		*hp++ = *first++ ;
	//und das zweite wort
	while (*second)
		*hp++ = *second++;
 
	
	*hp = 0; //abschließende 0
	
	return result;
}


strlen ist dabei ebenfalls eine in der Aufgabe selbst geschriebene Funktion - also nicht geschummelt
 
Zurück