在工作中,犯了一个严重的错误。在字符处理中把原字符串的地址传到函数中进行处理了,然后程序永远就达不到运行效果,作为代价,两天来排除这个错误,而且还是请教同事来解决的。
具体是什么错误呢,原因在于我使用了strtok函数,而且把一个静态变量的结构中字符串的地址直接传到函数中处理,由于后续还需调用这个静态的变量,所以在初始化之后,所有的操作都不成功。
strtok函数是根据分割列表对愿字符串进行分割处理,但是它的副作用是这个字符串不可逆,不能保持分割前的状态。如果我们后面仍需要使用这个字符串,我们必须把这个字符串复制到另一个存储区域中来处理,这样就可以避免字符串的值产生变化。
下面的程序段是演示副作用的产生:
#include <stdio.h>
#include <string.h>
int main(void)
{
char total_name[] = "envenler_A&urcbRC#HSYSPZXJC/siml14$mx$c2h2ppm$mag$t" ;
char ied[30]="";
char * pch,*iedname,*domname,*lnname,*fun_constr,*doname,*property;
pch = strtok(total_name,"&");
strncpy(ied,pch,strlen(pch)-2);
printf("pch:%s,ied:%s\n",pch,ied);
int j;
for(j = 0;pch!=NULL;j++)
{
if(j == 0)
{
pch = strtok(NULL,"#/$");
continue;
}
else if(j == 1)
domname = pch;
else if(j == 2)
lnname = pch;
else if(j == 3)
fun_constr = pch;
else if(j == 4)
doname = pch;
else if(j == 5)
property = pch;
else if(j == 6)
property = pch;
printf("pch:%s\n",pch);
if(j == 6)
break;
pch = strtok(NULL,"#/$");
}
printf("total_name:%s\n");
return 0;
}
Output:
|
pch:envenler_A,ied:envenler
pch:urcbRC
pch:HSYSPZXJC
pch:siml14
pch:mx
pch:c2h2ppm
pch:mag
total_name:mag
|