我已经提取了代码的“含义”部分(并且还替换了一些行来简化它)。
我有2个动态指针,一个用于当前行(从文件中提取),另一个用于当前令牌。 关注此问题,Free/delete strtok_r pointer before processing complete string? 我写了这个:
int main(void) {
int n = 455;
char *tok2, *freetok2;
char *line, *freeline;
line = freeline = malloc(n*sizeof(*line));
tok2 = freetok2 = malloc(n*sizeof(*tok2));
/* content of the file) */
const char* file_reading = "coucou/gniagnia/puet/";
/* reading from the file */
strcpy(line, file_reading);
strtok(line, "/");
/* get the second token of the line */
tok2 = strtok(NULL, "/");
fprintf(stdout, "%s \n", tok2); // print gniagnia
fprintf(stdout, "%s \n", line); // print coucou
/* free error */
//free(tok2);
/* worked, but maybe don't free "everything ?" */
//free(line);
free(freetok2);
free(freeline);
return 0;
}
但最后,我不确定什么是正确的,我发现这个解决方案不那么优雅(因为使用了2个“保存变量”。
这是对的吗?有没有办法改善它? 感谢
编辑:更改了我的代码,(并且它将处理文件的所有行)
include <unistd.h>
include <stdlib.h>
int main(void) {
char *tok2;
char *line;
/* content of the file) */
const char* file_reading = "coucou/gniagnia/puet/";
const char* file_reading2 = "blabla/dadada/";
/* reading from the file */
line = strdup(file_reading);
strtok(line, "/");
/* get the second token of the line */
tok2 = strtok(NULL, "/");
printf("%s \n", tok2);
printf("%s \n", line);
/* reading from the file */
line = strdup(file_reading2);
strtok(line, "/");
/* get the second token of the line */
tok2 = strtok(NULL, "/");
printf("%s \n", tok2);
printf("%s \n", line);
free(line);
return 0;
}
答案 0 :(得分:5)
您实际上并没有使用freetok2
指向的内存,您不需要malloc
任何内容,因此您不需要freetok2
变量。
在您的代码中说free(line)
或free(freeline)
是相同的,因此您根本不需要freeline
。
另一个问题是:malloc(n*sizeof(*line));
。您可能会说:malloc(n);
因为sizeof(char)
始终为1.但最重要的是:
line = malloc(strlen(file_reading) + 1);
strcpy(line, file_reading);
答案 1 :(得分:2)
代码应修改如下:
int main(void) {
int n = 455;
char *tok2;
char *line;
line = malloc(n*sizeof(*line));
/* content of the file) */
const char* file_reading = "coucou/gniagnia/puet/";
/* reading from the file */
strcpy(line, file_reading);
strtok(line, "/");
/* get the second token of the line */
tok2 = strtok(NULL, "/");
fprintf(stdout, "%s \n", tok2); // print gniagnia
fprintf(stdout, "%s \n", line); // print coucou
free(line);
return 0;
}