【发布时间】:2019-02-22 17:44:02
【问题描述】:
我正在使用我的 c 程序中的两个函数,但无法让它们合作。我的第一个函数遍历一个 csv 文件并使用 strtok() 根据“,”分隔符分隔标记。每个标记被保存到一个大小为 3 的字符数组中,如果特定标记与目标标记不匹配,则读取下一行输入并进行标记化,并用新的输入标记覆盖字符数组。
这里是使用的全局变量:
char * stateCityZip[3];
这是第一个函数的代码:
int zipToCity(char * zip)
{
char line[1024];
char * tok = malloc(20 * sizeof(char));
FILE * file = fopen("cityzip.csv", "r");
while (fgets(line, sizeof(line), file))
{
//State
tok = strtok(line, ",");
stateCityZip[0] = tok;
//City
tok = strtok(NULL, ",");
stateCityZip[1] = tok;
//Zip
tok = strtok(NULL, ",");
stateCityZip[2] = tok;
if (strcmp(stateCityZip[2], newZip) == 0) {
//printf("Found %s, %s\n", stateCityZip[0], stateCityZip[1]);
strlen(stateCityZip[1]));
return 1;
}
}
return 0;
}
我的第二个函数只是尝试打印 stateCityZip 的值。但是,当我打印这些值时,它们显示为空白。我发现解决此问题的唯一方法是取消注释
//printf("Found %s, %s\n", stateCityZip[0], stateCityZip[1]);
行。
这是我的第二个函数的代码:
int main() {
printf("City: [%s]", stateCityZip[1]);
printf("State: [%s]", stateCityZip[0]);
return 0;
}
输出:
City: []
State: []
【问题讨论】:
-
strtok返回char*,所以当您执行tok = strtok(line, ",");时,您正在泄漏使用malloc分配给tok的内存,所以不要将内存分配给tok。 -
@kiranBiradar 即使将 tok 的定义更改为:“char * tok”,它的行为也是一样的。
-
请参考 Daniel Pryden 的回答。我的第一条评论只是告诉您可能的内存泄漏,并没有解决您的问题。