那么,它是如何工作的? 我有以下代码块;
for (i = 0; i < N; ++i){
array[i] = malloc(M * sizeof(char));
fgets(buffer, M-1, fp);
array[i] = strtok(buffer, "\n");
}
如果我在printf("%s", array[i]);
for
内执行strtok()
for (i = 0; i < N; ++i)
printf("%s", array[i]);
按预期工作,但如果我这样做
for
在上一个N
之外,我获得了array[0]
odd_number_keeper = [item]
return max(odd_number_keeper)
的循环。
答案 0 :(得分:2)
功能
strtok()
有什么问题?
没什么,功能按预期工作。 使用的方式会产生问题。
注意:您已收到answer先生的dasblinkenlight,但是,只是为了详细说明另一个缺失点,添加此答案。
代码中的问题是
第1点。如前所述,strtok()
在后续调用中不会返回 persistent 的值。您必须复制每次调用中返回的令牌的值,否则,您将无法获得预期的值。为此,要么你必须(在对NULL令牌进行健全性检查之后)
FWIW,对于两者案例,您完成了array[i]
,您需要free()
它。
第2点:使用array[i]
malloc()
array[i] = malloc(M * sizeof(char));
然后分配指向它的另一个指针
array[i] = //some pointer...
你覆盖以前分配的指针,从而面临memory leak。避免使用此设计,并按照上述任一方法使代码正常工作。
那就是说,
sizeof(char)
保证根据1
标准生成C
。可能会避免乘以sizeof(char)
。fgets()
的返回值,以确保成功阅读。答案 1 :(得分:1)
strtok
的问题在于,只要您下次调用strtok
,它返回的令牌就会失效。您可以将其复制到单独的字符串中,也可以立即使用,然后丢弃,但必须在再次调用strtok
之前使用它。
for (i = 0; i < N; ++i){
array[i] = malloc(M * sizeof(char));
fgets(buffer, M-1, fp);
char *tok = strtok(buffer, "\n");
array[i] = malloc(strlen(tok)+1);
strcpy(array[i], tok);
}
当然,现在您需要在free
完成所有元素后致电array[]
。
请注意,strtok
不可重入,严重限制了其使用。更好的选择是strtok_r
,它是同一功能的可重入版本。