函数strtok()有什么问题?

时间:2015-06-14 18:05:33

标签: c string

那么,它是如何工作的? 我有以下代码块;

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) 的循环。

2 个答案:

答案 0 :(得分:2)

  

功能strtok()有什么问题?

没什么,功能按预期工作。 使用的方式会产生问题。

注意:您已收到answer先生的dasblinkenlight,但是,只是为了详细说明另一个缺失点,添加此答案

代码中的问题是

  • 第1点。如前所述,strtok()在后续调用中不会返回 persistent 的值。您必须复制每次调用中返回的令牌的值,否则,您将无法获得预期的值。为此,要么你必须(在对NULL令牌进行健全性检查之后)

    • 1.1。获取指针,分配内存(使用malloc()或系列)并使用strcpy()

    • 复制令牌内容
    • 1.2。使用(非标准)strdup()直接令牌复制到array[i]。无需单独分配内存。

    FWIW,对于两者案例,您完成了array[i],您需要free()它。

  • 第2点:使用array[i]

    将内存分配到malloc()
    array[i] = malloc(M * sizeof(char));
    

    然后分配指向它的另一个指针

    array[i] =  //some pointer...        
    

    覆盖以前分配的指针,从而面临memory leak。避免使用此设计,并按照上述任一方法使代码正常工作。

那就是说,

  1. (仅提供建议)sizeof(char)保证根据1标准生成C。可能会避免乘以sizeof(char)
  2. 请务必检查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,它是同一功能的可重入版本。