在这个程序中,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;
}
非常感谢您的帮助,反馈或建议。
答案 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;
}