1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

C - Strings und das Nullbyte

Dieses Thema im Forum "OS X-Developer" wurde erstellt von Wrandy, 12.12.09.

  1. Wrandy

    Wrandy Reinette de Champagne

    Dabei seit:
    15.02.09
    Beiträge:
    420
    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...
     
  2. FrankR

    FrankR Johannes Böttner

    Dabei seit:
    15.11.07
    Beiträge:
    1.155
    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.
     
  3. Wrandy

    Wrandy Reinette de Champagne

    Dabei seit:
    15.02.09
    Beiträge:
    420
    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
     

Diese Seite empfehlen