Ich entwickle eine History-Funktion für eine benutzerdefinierte C-Shell für eine Klasse. Ich brauche den Verlauf, um die letzten zwanzig Befehle anzuzeigen, die in der Shell eingegeben wurden. Der Befehlsverlauf wird mit dem folgende Format in einer lokalen Textdatei gespeichert werden:Parsen eines Puffers beeinflusst einen anderen?
0001 <command>
0002 <command>
0003 <command>
...
Wenn ich versuche, Zeilen aus der History-Datei zu drucken, nur die Zahlen gedruckt werden und nicht den Befehl selbst. Hier ist meine Funktion, um die Geschichte zu drucken:
169 int print_history()
170 {
171 int first = (current - 20);
172 if (first < 1)
173 first = 1;
174
175 char **arg_p;
176 FILE *fp = fopen("history", "r");
177 int count = 0;
178 char buff[MAX_LENGTH];
179 while(fgets(buff, sizeof buff, fp) != NULL)
180 {
181 char *temp_buf = buff;
182 printf("%s\n", temp_buf); // this line prints the entire line, just as I need it
183 arg_p = parse(buff);
184 printf("%s\n", temp_buf); // this line prints only the number
185 int temp = atoi(arg_p[0]);
186 if(temp >= first && temp <= current)
187 printf("%s\n", temp_buf);
188 }
189 fclose(fp);
190 }
Die printf Linien mit den Kommentaren (182 und 184) sind nur für die Fehlerprüfung. Wenn ich buff
parse, ändert es irgendwie temp_buf
, damit es nicht richtig anzeigt. Die Ausgabe von diesen beiden Linien (für einen einzelnen Zyklus Schleife) sieht wie folgt aus:
0035 exit
0035
Hier meine Parse-Funktion ist, dass buff
wird geleitet wird:
76 char **parse(char *line)
77 {
78 int size = 64;
79 int position = 0;
80 char **words = malloc(size * sizeof(char*));
81 char *word;
82 word = strtok(line, DELIM);
83 while (word != NULL)
84 {
85 words[position] = word;
86 position++;
87 word = strtok(NULL, DELIM);
88 }
89 words[position] = NULL;
90 return words;
91 }
Irgendwelche Ideen auf, warum das Parsen ein Puffer beeinflusst auch einen anderen Puffer? Jede Hilfe wird geschätzt.
Danke!
* "Wenn ich Buffs parse, ändert es irgendwie temp_buf." * Das ist, weil sie der gleiche Puffer sind. 'char * temp_buf = buff;' –
Also bindet 'char * temp_buf = buff' die beiden Puffer zusammen, so dass sie immer gleich sind? Ich nahm an, dass diese Zeile einen zweiten Puffer erstellen würde, der unverändert bleiben würde, wenn der erste Puffer geändert wurde. Ich glaube, ich habe das mit 'strcpy (temp_buf, buff)' behoben. Vielen Dank! – Unrealcow
Es gibt nicht zwei Puffer. Es gibt einen Puffer, auf den zwei Variablen zeigen. Lektion 1 mit Strings. 'A = B' erstellt keine neue Zeichenfolge. Und 'strcpy (temp_buf, buff)' funktioniert nur, wenn Speicher zugewiesen wurde. Wie vorgeschlagen, verwenden Sie 'strdup'. –