• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

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...
 
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.
 
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