wenn ich einen klartext hab und rufe den argument -h,werden die einzelnenen buchstaben anhand meines definierten arrays(array der 28 wörter) in wörter je nach buchstabe in meinem klartext umgewandelt
habe ich das richtig verstanden?
danke![]()
wenn ich einen klartext hab und rufe den argument -h,werden die einzelnenen buchstaben anhand meines definierten arrays(array der 28 wörter) in wörter je nach buchstabe in meinem klartext umgewandelt
habe ich das richtig verstanden?
danke![]()
Solange die dir zugeteilte Aufgabe stegit ist: ja.
sorry hab vergessen es zu erwähnen![]()
Ich habe folgendes problem
static const char *strings[]={"one","two","three"}
static char *text[5];
ich will einfach die strings elemente von strings[] in den array der pointer text[5] kopieren(pointer kopieren)
ich hab text[0]=strings[0] probiert aber funktioniert nicht. ich bekomme warning: assignment makes pointer from integer without a cast vom compiler
ich hab auch *text[0]=*strings[0] probiert dann aber ich bekomme segmetation fault
wie kann ich das lösen
danke![]()
Last edited by MSIO7; 01-04-2012 at 00:01.
static char *strings[]={"one","two","three"};
static char *text[5];
text[0] = strings[0];
printf("%s --- \n", text[0]); ---> Ausgabe: one
gibt es einen Grund warum du "strings" const gemacht hast??
Er hat durchaus einen guten Grund: jedes String-Literal ("hallo, ich bin ein String-Literal") ist vom Typ const char * und es ist eine sehr gute Idee, das formell zu erwähnen, denn in dem Moment, wo du in eine String-Konstante hineinschreibst, ist ein Segfault mehr als wahrscheinlich (wie ich kürzlich in einer meiner Betreuungseinheiten feststellen musste).
Rein prinzipiell indem du den String castest. Die Frage ist: warum? Du versuchst hier den Schutz des const-Schlüsselworts zu umgehen, und mir fällt keine Funktion ein, die du in stegit bräuchtest, die nicht mit einem const char * umgehen kann.
Umgekehrt kannst du aber jederzeit einem const char * einen char * zuweisen.![]()
ich brauche das deshalb weil ich mit static const *string[]={"one","two",...} 28 wörter(zeichenketten- array) initialisieren will.dann habe ich static char *cipher_text[300] definiert. jedes zeichen im eingelesenen text wird nach dem array index in das literal vom *string[] umgewandelt. string literale will ich in den cipher_text array speichern d.h im cipher_text wird die geheimbotschaft.. dann kann ich sie entweder in ein file abspeichern oder auf den bildschirm ausgeben .. ist das einen guten ansatz ?![]()
Es ist sicher ein möglicher Ansatz. Hilft es, wenn du static char *cipher_text[300] in static const char *cipher_text[300] änderst?
Du musst die Ergebnisse aber nicht unbedingt zwischenspeichern, sondern kannst die Wörter ja sofort ausgeben. fprintf kann helfen: wenn es auf dem Bildschirm landen soll, übergibst du als ersten Parameter stdout; wenn es in eine Datei geschrieben werden soll, dann übergibst du den entsprechenden FILE-Pointer als ersten Parameter.
jein. also segfaulten wird es weil er das literal in einen read-only bereich legt (so erzaehl ich das immer in der VO). aber was den typ angeht:
also formal ist der typ nicht "const char *", auch wenn das verhalten aehnlich wirkt. warum darf er is in einen read-only bereich legen und warum wird es deshalb segfaulten:Originally Posted by C99-6.4.5.5
wie immer, falls ich bei meiner interpretation falsch liege, bitte um aufklaerung.Originally Posted by C99-6.4.5.6
Willfähriges Mitglied des Fefe-Zeitbinder-Botnets
Mea culpa, du hast Recht. Ich habe es mit C++ verwechselt, wo die Const-Correctness-Offensive dazu führte, dass auch String-Literale einem Array von const chars entsprechen:
Angeblich weigert sich das Standard-Komitee, String-Literale auch in C const zu machen, auch nur aus Gründen der "bugward compatibility".Originally Posted by N3242-2.14.5 (8)
habe eine Verständnisfrage zur Angabe Mycompress.
ist das für eine stdin Eingabe gedacht oder auch wenn man aus einem File lesen soll?Definieren Sie für die maximale Anzahl an Zeichen in einer Zeile eine Konstante, wobei Sie annehmen
dürfen, dass keine Zeile mehr Zeichen enthält.
muss man das genau so machen?
weil wenn man von einem File liest, ist doch egal wieviele Zeilen bzw. welche Zeilenanzahl man liest?!
Last edited by Racket; 08-04-2012 at 19:42.
du kannst das bei mycompress natürlich mit fgetc machen, also pro character von file lesen.
wenn du es aber anders machst und pro Zeile liest, dann brauchst du die Begrenzung schon.
nämlich bei fgets(buffer, zeilenlaenge, filepointer)
mit fgets liest du die definierte Anzahl an Zeichen pro Zeile --> zeilenlaenge in deinen Buffer.
den deklarierst du vorher zB mit char buffer[zeilenlaenge];
am besten definierst du zeilenlaenge via:
#define zeilenlaenge (40)
oder eben eine andere zahl - das ist dann dir überlassen
kann ich auch direkt mit buffer[1][0], lesen die einzelnen char lesen?
Kannst du sicher, hast dann aber trotzdem nur maximal so viele Zeichen eingelesen, wie viel du an fgets übergeben hast (minus 1 für das NUL-Byte).
OK danke euch beiden!!
Wie kann ich ein einzelnes char in den buffer speichern, mit fputc hab ich gerade meine probleme!
char** fileBuffer;
char* newfileBuffer;
fputc( (int)zeichen, newfileBuffer );
newfileBuffer[0] = fileBuffer[1][0]; geht auch nicht
fuer ein zeichen reicht ein "char einzeichen". hast du pointer, brauchst du speicher. malloc ist dein freund. und mit fputc, wie aus der manpage ersichtlich, schreibt man in einen FILE stream.
Willfähriges Mitglied des Fefe-Zeitbinder-Botnets
Hi, hab ein kleines problem.
Also, ich lese mit fgets die eingabe in ein char array (jede zeile einzeln) und übergebe die Zeile dann in meine hide funktion. Funktioniert alles supi, solang die eingabe <= 12 zeichen hat. sobald ich mehr als 12 zeichen habe wird der rest einfach ignoriert, lasse mir mit printf zu testzwecken die eingabe nochmal ausgeben bevor ich sie übergebe und danach ebenfalls, vor dem übergeben in die neue funktion habe ich alle zeichen, danach nur noch 12... :/
hier ein ausschnitt des codes
edit:Code:while(fgets(buffer,sizeof(buffer),stdin)!=NULL){ ... strcpy(gesamt[i],buffer); if (hOptionCnt==1){ printf("%s \n",gesamt[i]); <----------HIER stimmt die Eingabe noch char **ergebnis=hOpt(gesamt[i]); k=0; while(ergebnis[k]!='\0'){ printf("%s",ergebnis[k]); k++; } printf("\n"); } ... } char** hOpt(char *in) { int k=0; char **output; int count=0; int x=0; output = (char**)malloc(1*sizeof(char*)); printf("%s\n",in); <-----HIER ist die Eingabe nur noch 12 Zeichen lang while(in[k]!='\0') { x=0; while(x<28){ ... } x++; } k++; } return output; }
achja und noch ein paar kleine sachen:
kann man davon ausgehen, dass keine Großbuchstaben verwendet werden?
ließt -f immer von einer file wie in der angabe?
Last edited by Tyleet; 10-04-2012 at 19:04.
Wie sind deine Variablen buffer und gesamt definiert?
Da ist es auch schon: die Größe eines Character-Pointers (char*) ist 8 Bytes (auf 64-Bit-Systemen); du allozierst also nur genug Platz für acht Zeichen. Du wirst dich entweder auf eine Maximalgröße beschränken müssen oder eine Anfangsgröße wählen und nach Bedarf expandieren.
Nein. Du kannst dir mit toupper() oder tolower() helfen -- Groß- und Kleinschreibung werden vom Versteckalgorithmus nicht unterschieden.
stegit liest gar nicht explizit von einer Datei -- dafür musst du stdin in der Shell umbiegen. Du solltest auf jeden Fall dein Programm so schreiben, dass Eingaben sowohl über das Terminal direkt als auch von einer Shell-verbogenen Datei akzeptiert werden.
thx für die antworten, nur noch eine letzte frage zu dem bsp:
muss das programm von der console mit dem befehl "stegit ..." gestartet werden oder mit "./stegit..." ?
Unter Unix lässt sich ein Programm nur mit seinem Namen genau dann starten, wenn es in einem der Verzeichnisse innerhalb der Umgebungsvariable PATH enthalten ist. Dein Programm soll also mit dem relativen Pfad ./stegit gestartet werden.
ich hab schon das programm gemacht aber wenn ich jetzt auf das Beispiel in der angabe (Geheimbotschaft pscht..) anschaue,verstehe ich nicht,warum die leerzeichen zwischen die wörter sind.woher sind sie gekommen?![]()
Sie werden bei der Ausgabe einfach nach jedem Wort hinzugefügt. Sonst kann man nicht wirklich die Grenzen zwischen den Wörtern erkennen.![]()
Nein. Für jeden Buchstaben, sowie für jedes Leerzeichen und jeden Punkt soll ein entsprechendes Wort aus der Liste ausgewählt und mit einem Leerzeichen danach ausgegeben werden. Außerdem werden des Öfteren zufällig Punkte ausgegeben (bestenfalls zwischen einem Wort und einem Leerzeichen).
ich hab das so gemeint ... wenn ich einen text hab z.b "ich bin informatiker" und meine array mit 28 elements *strings[]={"car","boat","cat","dog",...}. ich ersetze in mienem text jede buchstabe nach dem alphabet durch das wort im string array. z.b. das buchstabe 'a' im wort "informatik" bekommt "car" ... usw. und nach dem wort "cat" schon in meinem ersetzen text füge ich noch ein lernzeichen und zufällig punkte hinzu.
ich hab das ganz trivial gemacht indem ich einfach direkt ein leerzeichen ans wort schon bei der initialisierung gemacht habe als
words={"bla ", "blubb " ...};
und dann hab ich ein 2. array, aus dem wörter alle 5-15 zeichen randommäßig eingefügt werden:
wordsdot={"bla. ","blubb. " ...}
beim wieder ins plaintextübersetzten muss man dann halt beide arrays überprüfen.
Ansonsten kann man nach der Ausgabe jedes Worts randommäßig schauen, ob es an der Zeit ist, einen Punkt hinzuzufügen, diesen dann bei Bedarf ebenfalls ausgeben, und zu guter Letzt das Leerzeichen dranhängen. Beim Einlesen kann man dann an den Leerzeichen trennen und, falls das Wort mit einem Punkt endet, diesen herauslöschen (= mit einem NUL-Character überschreiben), bevor man im Array sucht.
ich hätte eine allgemeine Frage, wollte jetzt nicht unbedingt einen neuen Thread eröffnen. Undzwar heißt es bei der Abgabe im myTi dass wir alle verwendeten header-files in das Archiv kopieren sollen. Da wäre meine Frage wo ich jene finde, weil eine standard Suche spuckt mir teilweise 20 gleichnamige Dateien aus. Ich verwende Ubuntu und Netbeans
Ich glaub ich mach jetzt den Bachelor in Diablo 3
Die System-Header müssen nicht mitgepackt werden, nur die Header, die das Programm zusätzlich braucht. (Solche Zusatzheader hat man dann höchstwahrscheinlich selber geschrieben.)
Alles klar dankehab ich mir eigentlich eh schon gedacht
![]()
Ich glaub ich mach jetzt den Bachelor in Diablo 3
Bookmarks