einzelne zeichen in zeichenkette umwandeln



  • wie geht das am besten?

    folgendes:
    ich habe einen integer:

    int zahl = 65535;
    

    diesen habe ich mit:

    char val_string[5];
    sprintf(val_string, "%i", zahl);
    

    in einen char-wert umgewandelt, so dass ich mittel val_string[0] die 6 und mit val_string[1] die 5 ... bekomme.
    diese einzelnen charwerte wollte ich nun einer funktion übergeben, welche aber zeichenketten erwartet. wie kann ich dies entsprechend umwandeln?



  • Mal davon abgesehen, dass du bereits einen Buffer-Overflow hast. Wo ist denn dein Problem? Nach sprintf() hast du doch in val_string schon einen String aka Zeichenkette. Also übergibst du einfach val_string.



  • ich möchte eine zahl in einer schleife durchlaufen.

    also int 65636 soll folgende liefern:
    1. durchlauf: 6
    2. durchlauf: 5
    3. durchlauf: 6
    4. durchlauf: 3
    5. durchlauf: 6

    int main()                            
    {
    	int zahl = 65535;
    
    	unsigned char val_string[6];
    	sprintf(val_string, "%i", zahl); 
    
    	int block;
    
    	for (block = 0; block < 5; block++)
    	{
    		printf("%c\n", val_string[block]);
    	}
    }
    

    wenn ich aber in der ausgabe statt %c %s aufrufe verabsiedet sich das programm 😕

    mein genauers problem ist eine funktion welche folgende parameter erwartet:

    void RenderString(unsigned char *string, int sx, int sy, int maxwidth, int layout, int size, int color)
    


  • Ja wo ist denn das Problem? Ersetze einfach "unsigned char *string" durch "val_string" im Funktionsaufruf.



  • das problem ist nicht der funktionsaufruf!
    wenn ich das so mache mit der vorherigen umwandlung im main dann
    Segmentation fault



  • wär das eine annehmbare lösung ?

    int main(){
        int zahl = 65535;   
        unsigned char val_string[6];
        unsigned char char_str[2];
        int block;   
    
        char_str[1]='\0';
        sprintf(val_string, "%i", zahl);
    
        for (block = 0; block < strlen(val_string); block++){
            char_str[0]=val_string[block];
            RenderString(char_str, ... );
        }
        return 0;
    }
    

    Kurt



  • die o.g. funktion nimmt

    char * digit[10] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
    
    RenderString( digit[0], xa+10, sy+28, 306, LEFT, NORMAL, WHITE);
    

    ohne probleme, aber

    char val_string[6];
    sprintf(val_string, "%i", val); 
    
    RenderString( val_string[0], xa+10, sy+28, 306, LEFT, NORMAL, WHITE);
    

    da kackt das programm ab!



  • @ZuK: das klappt prima, danke vielmals ...

    aber wo war mein fehler? irgenwie sehe ich nicht ganz durch 😕



  • stdin schrieb:

    da kackt das programm ab!

    weiss zwar nicht was du unter abkacken verstehst. das programm sollte nicht compilieren. du übergibst mit val_string[0] ein char und RenderString erwartet ein null terminiertes char array.
    K



  • stdin schrieb:

    @ZuK: das klappt prima, danke vielmals ...

    aber wo war mein fehler? irgenwie sehe ich nicht ganz durch 😕

    Deine Funktion ist -- mit Verlaub -- Schrott (weil sie einen String erwartet, obwohl sie nur auf einem char operieren möchte). ZuKs Trick ist, der Funktion einen String zu geben, der aus dem relevanten char gefolgt von einer '\0' besteht. Einfacher wäre es, die Funktion entsprechend anzupassen oder uns zu verraten, was sie intern genau ausliest, weil vielleicht tut's auch einfach val_str+block oder so.



  • aha..., die funktion habe ich auch nur übernommen

    hier die funktion <jetzt hab ich auch das teminierende 0 gefunden>

    void RenderString(unsigned char *string, int sx, int sy, int maxwidth, int layout, int size, int color)
    {
    	int stringlen, ex, charwidth;
    
    	// set size
    
    		if(size == SMALL)
    		{
    			desc.font.pix_width = desc.font.pix_height = 26;
    		}
    		else if(size == NORMAL)
    		{
    			desc.font.pix_width = desc.font.pix_height = 32;
    		}
    		else
    		{
    			desc.font.pix_width = desc.font.pix_height = 40;
    		}
    
    	// set alignment
    
    		if(layout != LEFT)
    		{
    			stringlen = GetStringLen(string);
    
    			switch(layout)
    			{
    				case CENTER:
    					if(stringlen < maxwidth)
    					{
    						sx += (maxwidth - stringlen)/2;
    					}
    
    					break;
    
    				case RIGHT:
    
    					if(stringlen < maxwidth)
    					{
    						sx += maxwidth - stringlen;
    					}
    			}
    		}
    
    	// reset kerning
    
    		prev_glyphindex = 0;
    
    	// render string
    
    		ex = sx + maxwidth;
    
    		while(*string != '\0')
    		{
    			if((charwidth = RenderChar(*string, sx, sy, ex, color)) == -1)
    			{
    				return; /* string > maxwidth */
    			}
    
    			sx += charwidth;
    			string++;
    		}
    }
    

    und hier die unterfunktion

    int GetStringLen(unsigned char *string)
    {
    	int stringlen = 0;
    
    	// reset kerning
    
    		prev_glyphindex = 0;
    
    	// calc len
    
    		while(*string != '\0')
    		{
    			stringlen += RenderChar(*string, -1, -1, -1, -1);
    			string++;
    		}
    
    	return stringlen;
    }
    

    was haltet ihr davon?


Anmelden zum Antworten