• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

C - Strings und das Nullbyte

Wrandy

Jerseymac
Registriert
15.02.09
Beiträge
455
Hallo,

Wir haben die Aufgabe eine Zeichenkette in die andere zu kopieren, wenn sie reinpasst, und dieses Funktion soll dann die neue Länge zurückliefern. So weit so gut, habe ich auch hinbekommen, ABER: Eine Sache verstehe ich nicht. Und zwar: Ich habe nachdem ich die zweite Zeichenkette in die erste geschrieben habe zuerst kein Nullbyte mehr angehangen. Danach wird aber meine Funktion aufgerufen, die dann abbricht, wenn ein Nullbyte da steht.

Das funktioniert aber trotzdem und ich weiß nicht wirklich warum. Einzige Erklärung die ich noch habe: Zufall, dass halt genau da ein Nullbyte ist, aber das kann es ja irgendwie auch nicht sein.

Hier mal mein Code:
Code:
#include "strop3.h"
#include "assert.h"

int length(char str[]){
	int i=0;
	while (str[i]!='\0'){
		i++;
	}
	return i;
}

/*	if |b1|+|b2| < bl1 
 appends the character sequence stored in b2 to that contained in buffer b1
 returns |b1|+|b2|
 otherwise 
 b1 remains unchanged 
 returns -1
 */

int concat(char *b1, int bl1, char *b2){
	//essential to avoid a Segmentation fault, if b1 is longer than bl1
	assert(length(b1)<bl1);
	
	int i=0;
	int l1=0;
	int l2=0;
	
	l1=length(b1);
	l2=length(b2);
	if ((l1+l2)>bl1){
		return -1;
	}
	else {
		while (b2[i]!='\0'){
			b1[l1+i]=b2[i];
			i++;
		}
		[B]b1[l1+i]='\0';[/B]
		return length(b1);
	}
}

Wenn ich halt die viertletzte Zeile (fett markiert) weglasse, geht das immer noch, und das verstehe ich eben nicht.

Noch zur Erklärung, der Funktion werden zwei Strings, b1 und b2, übergeben, und bl1 enthält die Größe des Feldes b1.

Vielleicht kann mir das jemand erklären. Wäre sehr dankbar...
 

FrankR

Gascoynes Scharlachroter
Registriert
15.11.07
Beiträge
1.537
Naja, wahrscheinlich ist b1 komplett mit "0" initialisiert - durchaus möglich, aber eben undefiniert. Kommt dann auf den Compiler und/oder die malloc Library an.

PS:
Der Code ist auch etwas sehr lang, das Kopieren wäre z.B. mit
Code:
for (i=0; b1[l1+i]= b2[i]; i++)
    ;
return((l1+i) - 1);
für meinen Geschmack etwas mehr C like.

PS2:
Falls Ihr die Standard-Library verwenden dürft, würde ich auch eher zu strcat und strlen raten, um das Rad nicht neu zu erfinden.
 

Wrandy

Jerseymac
Registriert
15.02.09
Beiträge
455
Naja, wahrscheinlich ist b1 komplett mit "0" initialisiert - durchaus möglich, aber eben undefiniert. Kommt dann auf den Compiler und/oder die malloc Library an.

PS:
Der Code ist auch etwas sehr lang, das Kopieren wäre z.B. mit
Code:
for (i=0; b1[l1+i]= b2[i]; i++)
    ;
return((l1+i) - 1);
für meinen Geschmack etwas mehr C like.

PS2:
Falls Ihr die Standard-Library verwenden dürft, würde ich auch eher zu strcat und strlen raten, um das Rad nicht neu zu erfinden.

ok, also doch nur zufall...
Zum Code: Ich schreib den lieber etwas länger. Ich finde das dann verständlicher...
Standard Library wird in dieser Aufgabe explizit verboten. Wäre ja sonst auch quatsch...

Vielen Dank