string problem (eingaben, überprüfen, umwandeln)... newbie frage



  • Hallo zusammen,
    Ich versuche gerade ein Programm zu schreiben, mit dem ich einen string einlesen kann, auf ungültige zeichen überprüfen und anschließend zerlegen kann.

    1. schritt klappt schonmal:

    char data_string[16];
    scanf("%s",&data_string);
    

    2. es sollen nur hexadezimale zeichen zugelassen werden, leider hab ich kein idee, wie mans machen soll. ich habs mal so probiert:

    int c[22] = {'a','b','c','d','e','f','A','B','C','D','E','F','0','1','2','3','4','5','6','7','8','9'};
    
    for(k=0;k<22;k++){
    	if(strchr(data_string,c[k]) == 0)
    		count++;                     //counter wird erhöht, wenn zeichen gültig war
    }
    
    	if((22-count) != strlen(data_string)){ 
            //wenn der counter gleich der stringlänge war ist es gültig
    	printf(" nur hexadezimale Werte erlaubt ! \n\n");
    		}
    

    Das funktioniert auch, allerdings nicht, wenn zwei gleiche zeichen vorkommen 🙄

    3. Es soll der string in zweier pärchen zerlegt werden und ein char Array raus gemacht werden:
    Aus data_string="1A2B3C" soll data_char = 1A2B3C werden.

    Für das zerlegen würd ich gerne strncat oder eine andere funktion von string.h benutzen. allerdings weis ich nicht wie mans angehen soll.

    danke schon mal sehr für die hilfe 🙂



  • 1. scanf ist unsicher

    char data_string[16];
    scanf("%16s", data_string); // besser
    

    2. ich würde das anders machen

    int c[22] = {'a','b','c','d','e','f','A','B','C','D','E','F','0','1','2','3','4','5','6','7','8','9'};
    
    bool valid = true;
    for (unsigned i = 0; i < strlen(data_string), valid; ++i)
    {
        valid = false;
        for (unsigned j = 0; j < sizeof(c); ++j)
            if (c[j] == data_string[i])
                valid = true;
    }
    if (!valid)
        printf(" nur hexadezimale Werte erlaubt ! \n\n");
    




  • somachen:

    scanf("%s", data_string);
    

    nixe unde zeichene. fragene ascii code:

    int is_hex ( char c )
    {
    	return c>=48&&c<=57||c>=65&&c<=70||c>=97&&c<=102;
    }
    
    int main()
    {
    
    	char *s = "opqABCDEFabcdef0123456789xyz";
    
    	while(*s)
    	{
    		if ( is_hex(*s) )
    			printf("%c -> sí señor!\n", *s);
    		else 
    			printf("%c -> no señor!\n", *s);
    		s++;
    	}
    }
    

    buenas tardes.



  • danke für die schnelle antwort. hab das ganze jetzt noch angepasst und es funktioniert. (manches hat so nicht gefunzt... jetzt gehts aber 🙂 )

    int c[22] = {'a','b','c','d','e','f','A','B','C','D','E','F','0','1','2','3','4','5','6','7','8','9'};
            bool valid = 1;
            int i,j,k;
    
    	printf("\n insert data \n\n"); 
    	scanf("%16s",&data_string);
    
    	for (i = 0; i < strlen(data_string); ++i)
    	{
    		valid = 0;
    		for (j = 0; j < 22; ++j)
    			if (c[j] == data_string[i])
                valid = 1;
    	if (!valid)
    		printf(" nur hexadezimale Werte erlaubt ! \n\n"); 
    	}
    

    das %16s bedeutet, das maximal 16 zeichen eingegeben werden können?!

    jetzt muss nur noch das zerlegen klappen 😡 😡 😕



  • hab jetzt mal sowas versucht, liege damit aber wahrscheinlich voll daneben...

    ausserdem bliebe immernoch das problem den string in ein char zu ändern...

    data_string1[0] = strtok(data_string, ' ');
    	printf(" data[0]: %x",data_string1[0]);
    

    sorry für den doppelpost...



  • Das ist Falsch:

    scanf("%16s",&data_string);

    Das ist Richtig:

    scanf("%16s",data_string);

    Ein String ist ein Array an Char, und data_string ist dabei ein Zeiger auf den ersten Eintrag des Arrays. Scanf übergibst du, wie du das dir richtig gedacht hast einen Zeiger, da wie gesagt, data_string schon ein Zeiger ist, brauchst du das Kaufmannsund nicht davor machen.

    Ehrlich gesagt weiß ich jetzt garnicht was bei deinem Listing rauskommen würde, wahrscheinlich was Falsches :-D.

    mfg martin


Anmelden zum Antworten