zahlenblöcke aus string auslesen und bearbeiten
-
hi, hab a problem.
ich programmiere grad für c das rsa verfahren, und häng jetzt bei einem reinen c problem. wenn ich entschlüsseln möchte müssen zahlenblöcke eingegeben werden, z.b.: 3456 78935 5632 43289 (frei erfundene zahlen)
diese haben somit auch eine unterschiedliche länge, sind aber mit leerzeichen voneinander getrennt. somit muss ich das ja auch über auslesen von strings machen, nur wie? wie les ich den ersten zahlenblock aus bis zum leerzeichen, bearbeite ihn(ok das weiß ich wie, umwandeln in ein int wert, entschlüsseln) und dann geb ich das was entschlüsselt rauskommt wieder aus. und dann nächsten??????
kann mir jemand beim einlesen der einzelnen zahlenblöcke bitte helfen. ich hab keine ahnung wies gehn soll, hab schon so einiges ausprobiert, funkt aber ni.
vielen dank schon voraus
mfg schnuffi
-
-
hi und danke für die schnelle antwort, dem link und somit auch für strtok
nur es will noch ni, mach ich da irgendeinen fehler???char str[50];
char* erg;printf("geben sie ein:\n");
scanf("%s", str);erg=strtok(str, " ");
while (erg != NULL)
{
printf("%s", erg);
erg = strtok(NULL, " ");
}es gibt mir dann nur h aus wenn ich "h a l l o" eingebe. warum???
-
andere möglichkeit zum einlesen als integer ist natürlich auch:
#include <stdio.h> int main() { char* str="3456 78935 5632 43289"; int vals[4], i; sscanf(str, "%d %d %d %d", &vals[0], &vals[1], &vals[2], &vals[3]); for(i=0; i<4; ++i) printf("%d. Zahl = %d\n", i, vals[i]); return 0; };
-
hi, dankeschön für die antwort!
das würde ja klappen, wenn ich vorher weiß wieviele blöcke er eingibt, nur das weiß ich nicht vorher, das is es ja leider.
dankeschön trotzdem
-
(@ten)
ok, es klappt doch, nur nicht wenn ich
erg=strtok(str, " ");
sag, wenn ich da ein zeichen wie "," oder "." o.ä. funktionierts, nur nicht mit nem leerzeichen. weiß du (oder jem. anderes) warum?
vielen dank
-
also wenn du weisst, dass die leerzeichen nur zwischen den Zahlenblöcken vorkommen, dann könntest du ja einfach den String einmal durchwandern und speicher für (len+1)*sizeof(int) reservieren. wenn das nicht der fall ist dann wird zwar n bisschen aufwändiger, aber das ist nur minimal. und zu deiner frage: das leerzeichen selbst ist ja ein token und es macht daher wenig sinn es als parameter zu übergeben.
-
schnuffi_1986 schrieb:
(@ten)
ok, es klappt doch, nur nicht wenn ich
erg=strtok(str, " ");
sag, wenn ich da ein zeichen wie "," oder "." o.ä. funktionierts, nur nicht mit nem leerzeichen. weiß du (oder jem. anderes) warum?
vielen dankso kannst du's anwenden
void main() { char str[] = "3456 78935 5632 43289"; char *token = strtok (str, " "); // erstes token holen while (token) // solange tokens da sind... { printf ("%s\n", token); // ...ausgeben und... token = strtok (0, " "); // nächstes token holen } }
aber bedenke: strtok setzt nullen in den string ein!
also nicht bei stringkonstanten oder read-only speicher verwenden (vorher eventuell umkopieren)
-
schnuffi_1986 schrieb:
es gibt mir dann nur h aus wenn ich "h a l l o" eingebe. warum???
Weil der Rest deiner Eingabe noch im Tastaturpuffer darauf wartet, gelesen zu werden (scanf() liest (so wie du es verwendet hast) nur bis zum ersten Whitespace - du benötigst fgets() oder
scanf("%[^\n]",str);
).@ten: als alter Hast müsstest du eigentlich besser wissen, daß du hier für "void main()" erschossen werden kannst
-
@ten: *erschiesz* *muhahaha*
@OP: ich würd' schleife, realloc, falscheingabe bricht ab...Greetz, Swordfish
-
Ich halte strtoul sowieso für die bessere Lösung.
#include <stdio.h> #include <stdlib.h> int main() { int i, vals[4]; char *s = "2345 6543 9876 3345"; for (i = 0; i < 4; i++) { vals[i] = strtoul(s, &s, 10); printf("%u: %u\n", i, vals[i]); } return 0; }
-
CStoll schrieb:
@ten: als alter Hase müsstest du eigentlich besser wissen, daß du hier für "void main()" erschossen werden kannst
ich weiss, aber die meisten compiler, die ich kenne, haben kein problem damit. codewarrior, iar, imagecraft, vc6, keil, greenhills finden 'void main' nicht verwerflich. nur der blöde gcc gibt'n warning, aber der muckt ja schon rum, wenn man am ende der datei das carriage-return weglässt.
keksekekse schrieb:
Ich halte strtoul sowieso für die bessere Lösung.
nur wenn man's als zahlenwert braucht...
-
Selbst wenn dein Lieblings-Compiler entsprechend tolerant mit dem ANSI-Standard umgeht, solltest du noch lange nicht jedem Neuling solche Flausen in den Kopf setzen ("void main()" ist genauso falsch wie "fflush(stdin);").
-
CStoll schrieb:
("void main()" ist genauso falsch wie "fflush(stdin);").
'void main' ist doch harmlos. das ist doch nur so spezifiziert worden, damit 'main' was ans 'host environment' zurückgeben kann (man kann's aber auch mit exit() machen). 'fflush(stdin)' ist dagegen schon schlimmer...
-
dankeschön für die ganzen infos zu meinem problem ... es funktioniert jedenfalls vorerst, worüber ich sehr froh bin ...
und was void main() und fflush(stdin) angeht ... hm ich stell mich mal dumm, weil ich c erst 1 semester hat und unser prof hat immer gemeint für uns würde void main (void) reichen und das dieses fflush(stdin) verdammt wichtig sei.
darf ich fragen was daran so falsch is?
dankeschön
gruß schnuffi
-
lies die faq, da stehts.
-
ten schrieb:
CStoll schrieb:
("void main()" ist genauso falsch wie "fflush(stdin);").
'void main' ist doch harmlos. das ist doch nur so spezifiziert worden, damit 'main' was ans 'host environment' zurückgeben kann (man kann's aber auch mit exit() machen). 'fflush(stdin)' ist dagegen schon schlimmer...
Naja, die Frage, ob man nicht Standardkonformen Blödsinn den man sich angewohnt hat, unbedingt weitergeben will...
Greetz, Swordfish
-
Swordfish schrieb:
Naja, die Frage, ob man nicht Standardkonformen Blödsinn den man sich angewohnt hat, unbedingt weitergeben will...
naja, ich achte bei 'main' nicht so auf standardkonformität.
aber das muss ja keiner nachmachen...
ausserdem steht ja auch geschrieben:In a freestanding environment (in which C program execution may take place without any benefit of an operating system), the name and type of the function called at program startup are implementation-defined.
demnach müsste ich bei jedem code, den ich poste, dazuschreiben: 'vorsicht! nur ohne betriebssystem oder ähnlichem starten'
-
Das wirklich gute an ANSI/ISO-C ist wohl, dass man in festen Teams wenigstens eine Diskussionsgrundlage hat, um sich Standards für das Team zu schaffen. Vielleicht sollten wir dem armen OP einfach sagen, mit int main( ); geht's fast immer
ten, nix für ungut.
Greetz, Swordfish
-
Swordfish schrieb:
...mit int main( ); geht's fast immer
aber eben nur 'fast'.
manch ein compiler findet's dann gar nicht lustig, wenn man das 'return' weg lässt