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