程序改变生活

strtok函数的陷阱

在工作中,犯了一个严重的错误。在字符处理中把原字符串的地址传到函数中进行处理了,然后程序永远就达不到运行效果,作为代价,两天来排除这个错误,而且还是请教同事来解决的。
具体是什么错误呢,原因在于我使用了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:
1
2
3
4
5
6
7
8
pch:envenler_A,ied:envenler
pch:urcbRC
pch:HSYSPZXJC
pch:siml14
pch:mx
pch:c2h2ppm
pch:mag
total_name:mag

posted on 2012-09-16 19:08 乐乐 阅读(575) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理