C 斯特托克:我不知道为什么这个项目总是失败
在这个程序中,char*标记是用一个奇怪的垃圾值初始化的。我无法对它进行排序。以下是源代码:C 斯特托克:我不知道为什么这个项目总是失败,c,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
#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;
}
#包括
#包括
#包括
void fetch_值(char*string、int pos、char*dest)
{
字符*令牌;
int i=0;
令牌=strtok(字符串,“,”);
如果(位置>1)
{
令牌=strtok(空,“”,“”);
while(istrtok
的第一个参数必须是可修改的。您的代码传递了一个不可修改的字符串文本。这会导致未定义的行为
解决此问题的最简单修改如下:
char numList[] = "14174000100,35679700322,35679700322,35679700322,35679700322,14174000999,919440710210000,1";
fetch_value(numList, 0, checking);
您还应该注意,
strtok
是一个不可重入的旧函数,因为它使用静态变量来保存其状态。在新代码中,您应该使用该函数的可重入版本-,它需要您传递内存来保存状态。strtok的第一个参数必须是可修改的ode传递一个不可修改的字符串文本。这会导致未定义的行为
解决此问题的最简单修改如下:
char numList[] = "14174000100,35679700322,35679700322,35679700322,35679700322,14174000999,919440710210000,1";
fetch_value(numList, 0, checking);
您还应注意,strtok是一个不可重入的旧函数,因为它使用静态变量保存其状态。在新代码中,您应使用该函数的可重入版本-,它要求您传递内存以保存状态。请改为:
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;
}
改为这样做:
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;
}
你把这个标记为“C”。什么是<代码> <代码>?这里是C++和不需要的。你把它标记为“C”。这里是什么?<代码> <代码>?这是C++和不需要的。