Problem mit Strings (zeichenkette)
-
Denke daran, dass bei fgets meistens auch ein abschließendes '\n' vorkommt, das du sicher nicht brauchst.
Mit Variablennamen wie "i_i" machst du dir keine Freunde.
-
DirkB schrieb:
Ein einzelnes char ist auch nur eine Ganzzahltyp, wie int.
Nebenbei benutzt du es ja auch so in Zeile 6.Du brauchst auch nicht den ASCII-Wert des Zeichens.
Schreib das Zeichen in einfachen Hochkommas hin.switch (sent[i_i]) { case 'i': ....; break; case '0': ...; break; }
Deine Zeile 7 ist in einer for-Schleife ziemlich übel.
Schreib statt i_i++ gleichi_i += 5
(in Zeile 4)ALso sagen wir mal bei bei case S
case 'S':
wie kann S in $ umstellen? ich darf doch S = $ nicht machen wenn es um chars geht, ist es nicht verboten?
Also soll ich irgendwelche string funktion nehmen? wie strcpy? oder strcat?
Wutz schrieb:
Denke daran, dass bei fgets meistens auch ein abschließendes '\n' vorkommt, das du sicher nicht brauchst.
Mit Variablennamen wie "i_i" machst du dir keine Freunde.also ich wollte user string ohne zeichen limit haben aber ich habe kein andere weg gefunden. Ich will ein String von User bekommen der auch grenzlos sein kann aber ich habe alles probiert ging nicht und deswegen habe ich fget funktion genommen.
Es funktioniert auch aber ist sehr limited.
Wenn du ein andere und bessere variante hast, dann bitte zeigen, wird mir auch sehr helfen.
-
rocker1234 schrieb:
Also soll ich irgendwelche string funktion nehmen? wie strcpy? oder strcat?
strcpy+strcat sind C Grundlagen, die erklärt dir hier kaum jemand, die musst du selbst lernen.
char *liesString(void) { char input[10],*s=calloc(1,1); while( fgets(input,10,stdin) ) strcat(s=realloc(s,strlen(s)+11),input); s[strlen(s)-1]=0; return s; } int main() { char *input = liesString(); ... puts(input); ... free(input); }
-
rocker1234 schrieb:
Ich muss ein zeichenkette anlegen und es mit einem beispielsatz initialiesieren(zeichenkettekonstante).
Dann muss ich in mein Hauptprogram eine 2te Zeichenkette anlegen mit 80 Zeichen
die später das generierte Passwort aufnimmt.
Ich MUSS ein funktion gen_passwd() implementieren, und diese Funktion wird aus dem Passwordsatz mein Passwort erzeugen.
ALSO Wie mein Passwort aussehen soll: Erste Buchstabe und danach jeden fünfte Buchstabe bis der SAtz zu Ende ist.
Also wnn ich mein Passwort habe, muss ich es noch Harden und dafür brauch ich ein harden_passwd funktion. Hier muss ich mein passwort sicherer machen und Buchstaben gegen Sonderzeichen oder Ziffern austauschen.
bsp: S in $, I -> 1, i->! leerzeichen -> _etc etc
ich MUSS hier mit switch case anweisungen arbeiten.
Das gehärte password wird in 2te zeichenkette im Hauptprogram abgelegt. Dabei wird der ursprüngliche inhalt überschrieben
also Ho__t oder H0__t.Hier bitte:
#include <stdio.h> #include <ctype.h> #include <string.h> void gen_pass(char source[], char passwd[]) { int i, j; int len = strlen (source); j = 0; for(i = 0; i < len; i+=5, ++j) { passwd[j] = source[i]; } passwd[j] = 0; } void harden_passwd (char passwd[]) { int i; int len = strlen (passwd); for (i=0; i<len; ++i) { switch (toupper(passwd[i])) { case 'A' : passwd[i] = '4'; break; case 'B' : passwd[i] = '8'; break; case 'C' : passwd[i] = '('; break; case 'D' : passwd[i] = 'Ð'; break; case 'E' : passwd[i] = '3'; break; case 'F' : passwd[i] = 'ƒ'; break; case 'G' : passwd[i] = '6'; break; case 'H' : passwd[i] = '4'; break; case 'I' : passwd[i] = '1'; break; case 'J' : passwd[i] = '¿'; break; case 'K' : passwd[i] = 'X'; break; case 'L' : passwd[i] = '£'; break; case 'M' : passwd[i] = 'W'; break; case 'N' : passwd[i] = '?'; break; case 'O' : passwd[i] = '0'; break; case 'P' : passwd[i] = 'p'; break; case 'Q' : passwd[i] = '9'; break; case 'R' : passwd[i] = '2'; break; case 'S' : passwd[i] = '$'; break; case 'T' : passwd[i] = '7'; break; case 'U' : passwd[i] = 'µ'; break; case 'V' : passwd[i] = 'A'; break; case 'W' : passwd[i] = 'M'; break; case 'X' : passwd[i] = '+'; break; case 'Y' : passwd[i] = '9'; break; case 'Z' : passwd[i] = '2'; break; case ' ' : passwd[i] = '_'; break; } } } int main(void) { char sent[] = "Ich glotz dir in das Passwort, Kleines"; char passwd[80]; gen_pass(sent, passwd); printf("%s\n", passwd); harden_passwd (passwd); printf("%s\n", passwd); return 0; }
viele grüße
ralph
-
ote="Wutz"]
rocker1234 schrieb:
Also soll ich irgendwelche string funktion nehmen? wie strcpy? oder strcat?
strcpy+strcat sind C Grundlagen, die erklärt dir hier kaum jemand, die musst du selbst lernen.
char *liesString(void) { char input[10],*s=calloc(1,1); while( fgets(input,10,stdin) ) strcat(s=realloc(s,strlen(s)+11),input); s[strlen(s)-1]=0; return s; } int main() { char *input = liesString(); ... puts(input); ... free(input); }
[/quote]
du hast mich falsche verstanden,
ich weiss was strcpy und strcat machen, ich wollte nur Fragen ob ich sie im
switch statements benutzen darf?rkhb schrieb:
rocker1234 schrieb:
Ich muss ein zeichenkette anlegen und es mit einem beispielsatz initialiesieren(zeichenkettekonstante).
Dann muss ich in mein Hauptprogram eine 2te Zeichenkette anlegen mit 80 Zeichen
die später das generierte Passwort aufnimmt.
Ich MUSS ein funktion gen_passwd() implementieren, und diese Funktion wird aus dem Passwordsatz mein Passwort erzeugen.
ALSO Wie mein Passwort aussehen soll: Erste Buchstabe und danach jeden fünfte Buchstabe bis der SAtz zu Ende ist.
Also wnn ich mein Passwort habe, muss ich es noch Harden und dafür brauch ich ein harden_passwd funktion. Hier muss ich mein passwort sicherer machen und Buchstaben gegen Sonderzeichen oder Ziffern austauschen.
bsp: S in $, I -> 1, i->! leerzeichen -> _etc etc
ich MUSS hier mit switch case anweisungen arbeiten.
Das gehärte password wird in 2te zeichenkette im Hauptprogram abgelegt. Dabei wird der ursprüngliche inhalt überschrieben
also Ho__t oder H0__t.Hier bitte:
#include <stdio.h> #include <ctype.h> #include <string.h> void gen_pass(char source[], char passwd[]) { int i, j; int len = strlen (source); j = 0; for(i = 0; i < len; i+=5, ++j) { passwd[j] = source[i]; } passwd[j] = 0; } void harden_passwd (char passwd[]) { int i; int len = strlen (passwd); for (i=0; i<len; ++i) { switch (toupper(passwd[i])) { case 'A' : passwd[i] = '4'; break; case 'B' : passwd[i] = '8'; break; case 'C' : passwd[i] = '('; break; case 'D' : passwd[i] = 'Ð'; break; case 'E' : passwd[i] = '3'; break; case 'F' : passwd[i] = 'ƒ'; break; case 'G' : passwd[i] = '6'; break; case 'H' : passwd[i] = '4'; break; case 'I' : passwd[i] = '1'; break; case 'J' : passwd[i] = '¿'; break; case 'K' : passwd[i] = 'X'; break; case 'L' : passwd[i] = '£'; break; case 'M' : passwd[i] = 'W'; break; case 'N' : passwd[i] = '?'; break; case 'O' : passwd[i] = '0'; break; case 'P' : passwd[i] = 'p'; break; case 'Q' : passwd[i] = '9'; break; case 'R' : passwd[i] = '2'; break; case 'S' : passwd[i] = '$'; break; case 'T' : passwd[i] = '7'; break; case 'U' : passwd[i] = 'µ'; break; case 'V' : passwd[i] = 'A'; break; case 'W' : passwd[i] = 'M'; break; case 'X' : passwd[i] = '+'; break; case 'Y' : passwd[i] = '9'; break; case 'Z' : passwd[i] = '2'; break; case ' ' : passwd[i] = '_'; break; } } } int main(void) { char sent[] = "Ich glotz dir in das Passwort, Kleines"; char passwd[80]; gen_pass(sent, passwd); printf("%s\n", passwd); harden_passwd (passwd); printf("%s\n", passwd); return 0; }
viele grüße
ralphdas sieht ganz sauber aus,
aber habe nur 1 Problem, ich darf noch cytpe library nicht benutzen, wir haben es noch nicht gemacht, für diese Aufgabe muss ich nur mit String.h Library arbeiten
danke trotzdem !
-
rocker1234 rocker1234 schrieb:
aber habe nur 1 Problem, ich darf noch cytpe library nicht benutzen, wir haben es noch nicht gemacht, für diese Aufgabe muss ich nur mit String.h Library arbeiten
Dann kannst du die Buchstaben doppelt aufführen oder du schreibst dir
toupper()
selber.Nebenbei sind die *.h-Dateien sog. Headerfiles und keine Libraries.
Da stehen die Deklarationen für Funktionen und Definitionen für Typen und globale Variablen drin.
-
so guys,
Ich habe das Program fertig.
ALso es funktioniert perfekt.#include<stdio.h> #include<string.h> void gen_pass(char source[], char passwd[]) { int i; int j=0; int len = strlen(source); for(i = 0; i < len; i+=5, j++) { passwd[j] = source[i]; } passwd[j] = 0; } void harden_pass(char passwd[]) { int i; int len = strlen (passwd); for (i =0 ; i<len; i++) { switch (passwd [i]) { case 'S': passwd[i] = '$'; break; case 's': passwd[i] = '$'; break; case 'L': passwd[i] = '1'; break; case 'l': passwd[i] = '1'; break; case 'i': passwd[i] = '!'; break; case 'b': passwd[i] = '6'; break; case 'x': passwd[i] = '%'; break; case 'c': passwd[i] = '('; break; case 'e': passwd[i] = '{'; break; case '0': passwd[i] = '0'; break; case 'X': passwd[i] = '%'; break; case 'm': passwd[i] = 'w'; break; case 'z': passwd[i] = '~'; break; case ' ': passwd[i] = '_'; break; } } } int main() { char s1[]= "Please type a sentence smaller then 100 characters to generate a password:"; char sent[100]; printf("\n%s\n", s1); fgets(sent,100,stdin); char passwd[80]; gen_pass(sent, passwd); printf("%s\n", passwd); harden_pass(passwd); printf("%s\n" ,passwd); getchar(); return 0; }
Ich habe nur 1 Frag an euch.
kann mann in gen_pass funktion nur mit zeigern arbeiten?
also hier:
void gen_pass(char source[], char passwd[]) { int i; int j=0; int len = strlen(source); for(i = 0; i < len; i+=5, j++) { passwd[j] = source[i]; } passwd[j] = 0; }
Also momentan gibt hier kein pointers aber ich will nur testen ob es überhaupt auch möglich ist, weil ich will mehr über char und string pointers lernen, die sind verwirrend für mich.
Ich will mich hier auch bedanke für Ihre Mühe.
Ich bin ein newbie und es hilft immer viel.
-
Du arbeitest in deiner Funktion schon mit Zeigern.
source und passwd sind (in deiner Funktion gen_pass) Zeiger auf char.
Es ist egal, ob dusource[i]
oder*(source+i)
schreibst.Da du aber jedes 5. Zeichen nimmst, brauchst du eh den Test auf len (also auch die Variable i).
Die Funktion harden_pass kannst du dagegen besser auf Zeigerschreibweise umstellen:
void harden_pass(char *passwd) // das char passwd[] kann da aber auch stehen bleiben { while (*passwd != '\0') // oder kurz einfach while (*passwd) { switch (*passwd) { case 'S': *passwd = '$'; break; ... case ' ': *passwd = '_'; break; } ++passwd; // Zeiger weiterzählen. Er zeigt jetzt auf das nächste Zeichen } }
Du sparst dir die Variablen i, len und die Arrayberechnung.
Ob das übersichtlicher ist, musst du entscheiden.
Da der Compiler den Code optimiert (wenn du ihn lässt), ist es egal welche Version du nimmst.
-
ja genau so wollte ich es auch sehen,
also ich brauche umbedingt mehr char-string pointer training,
die verwirren mich immeralso ein Frage
diese Teil hier (*passwd != '\0')In Wörtern: pointer to passwd is not equal to null terminator?
ist das Richtig?
-
"Ist der Wert auf den passwd verweist ungleich dem Zeichen '\0'"
In C wird das Zeichen '\0' mit dem Wert 0 als Stringendekennzeichen genutzt.Das kann man auch abkürzen:
while (*passwd)
da alle Werte ungleich 0 als wahr gelten. 0 ist demnach unwahr.
Und die while-Schleife läuft solange der Ausdruck in den Klammern wahr ist.
-
Super
danke nochmal für die Information
sehr hilfsreich !
-
Hallo Leute,
Ich habe ein Program geschrieben für Palindrombildung.
So sieht es aus:
#include <stdio.h> #include <string.h> int mystrlen(char s[], int count)//to count chars instead of strlen lib function { char *ptr = s; count = 0; while (*ptr != '\0') { count++; ptr ++; } return count = count-1 ; } void palindrom(char usr2[], char usr3[]) // thats where my first problem is { int i; int u=0; int t; int v = 0; u = mystrlen (usr2, u); v=u; for (i=0, t=u-1; i<u; i++, t--) { usr3[t] = usr2[i]; v--; } usr3[t] = 0; } int main() { int cntr=0; printf("Please Enter a word to get its palindrome:\n"); char usr[100]; char usr2[100]; char usr3[100]; fgets(usr,100,stdin); cntr = mystrlen (usr , cntr); printf("Number of chars %d\n", cntr); strcpy (usr2, usr); printf("usr2 = %s", usr2); palindrom(usr2, usr3); strcat (usr2, usr3); printf("Palindrome is %s", usr2); getchar(); return 0; }
Probleme:
- Ich will so ein Ergebnis bekommen:
Bitte geben Sie ein Wort zu Palindrombildung ein:
ReitDas Palindrome lautet :reittier
---------------------------------------------------Ich bekomme aber immer:
Das Palindrome lauter: reit
tieres geht immer in new line
- Wenn ich wort eingeben wir "ab" (also mir nur 2 chars) mein Program kehrt es rum aber ich bekomme nach dem "ba" umbekannte zeichen und es passirt nur wenn ich ein wort eingebe der weniger als 3 chars hat.
Also vielleicht kann mir hier jemand weiterhelfen
danke im Voraus
-
Sorry double post !