解析一个缓冲区影响另一个?

时间:2016-04-04 07:42:54

标签: c

我正在为一个类的自定义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 }

为什么解析一个缓冲区的想法也会影响另一个缓冲区?任何帮助表示赞赏。

谢谢!

2 个答案:

答案 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)的内容就会改变。