0

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

#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;
}

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

4

2 回答 2

3

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

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

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

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

于 2013-03-30T13:38:58.540 回答
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;
    }
于 2013-03-30T13:40:24.177 回答