Strtok:我不知道为什么这个程序会失败

时间:2013-03-30 13:36:54

标签: c

在这个程序中,char *令牌被初始化为一个奇怪的垃圾值。我无法将其排序。这是源代码:

#include<iostream>
#include<string.h>
#include<stdlib.h>

void fetch_value(char *string,int pos,char *dest)
{
    char *token;
    int i=0;
    token=strtok(string,",");
    if(pos>1)
    {
        token=strtok(NULL,",");
        while(i<pos-1){
            token=strtok(NULL,",");
            printf("token =%s\n",token);
            i++;
        }
        strcpy(dest,token);
    }
    else
    {
        strcpy(dest,token);
    }
}

int main(void)
{
    char checking[100];
    memset(checking,0x00,sizeof(checking));
    fetch_value("14174000100,35679700322,35679700322,35679700322,
            35679700322,14174000999,919440710210000,1",0,checking);
    printf("checking=%s\n",checking);
    return 0;
}

非常感谢您的帮助,反馈或建议。

2 个答案:

答案 0 :(得分:3)

strtok的第一个参数必须是可修改的。您的代码传递一个字符串文字,可修改。这导致了不确定的行为。

解决问题的最简单修改如下:

char numList[] = "14174000100,35679700322,35679700322,35679700322,35679700322,14174000999,919440710210000,1";
fetch_value(numList, 0, checking);

您还应该注意strtok是一个不可重入的旧函数,因为它使用静态变量来保存其状态。在新代码中,您应该使用函数的可重入版本 - strtok_r,这需要您传递内存以保存状态。

答案 1 :(得分:1)

请改为:

 int main(void)
   {
     char checking[100];
     memset(checking,0x00,sizeof(checking));
     char string[] = "14174000100,35679700322,35679700322,35679700322,
     35679700322,14174000999,919440710210000,1";
     //now string can be modified.
     fetch_value(&string[0],0,checking);
     printf("checking=%s\n",checking);
     return 0;
    }