我正在为一个类的自定义C shell开发一个历史记录函数。我需要历史记录来显示在shell中输入的最后20个命令。命令历史记录存储在本地文本文件中,格式如下:
0001 <command>
0002 <command>
0003 <command>
...
当我尝试从历史文件中打印行时,只打印数字而不是命令本身。这是我打印历史的功能:
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 }
带有注释(182和184)的printf行仅用于错误检查。当我解析buff
时,它会以某种方式更改temp_buf
,以使其无法正确显示。这两行的输出(单循环周期)如下所示:
0035 exit
0035
这是我传递给buff
的解析函数:
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 }
为什么解析一个缓冲区的想法也会影响另一个缓冲区?任何帮助表示赞赏。
谢谢!
答案 0 :(得分:2)
strtok
具有破坏性。
这个功能是破坏性的:它写了&#39; \ 0&#39;中的人物 字符串str的元素。特别是,字符串文字不能 用作strtok的第一个参数。
取自strtok
doc here。
答案 1 :(得分:2)
在parse()
功能中,您将单词存储为
words[position] = word;
但是,你应该做
words[position] = strdup(word);
例如复制字符串。一旦您阅读下一行,word
又名line
又名buff
(来自main)的内容就会改变。