当前位置: 技术问答>linux和unix
一个有关strcat()的问题
来源: 互联网 发布时间:2016-04-17
本文导语: 写程序中出现了个问题,示意代码如下:(在linux环境下) char str[3]="1"; strcat(str,str); str[0]='0'; //执行完这步完后,调试得str值为"01"; char s[3]="1";//str值还为"01"; strcat(s,s);//执行完这步完后,str值却变成了为"111"; 这是为什么呢?...
写程序中出现了个问题,示意代码如下:(在linux环境下)
char str[3]="1";
strcat(str,str);
str[0]='0'; //执行完这步完后,调试得str值为"01";
char s[3]="1";//str值还为"01";
strcat(s,s);//执行完这步完后,str值却变成了为"111";
这是为什么呢?(以上代码在VC6.0下都不会出现这种问题)
第二个问题:
后来我查看了linux下strcat()的源码,如下:
char *strcat(char *dest,const char *src)
{
char *tmp=dest;
while(*dest)
dest++;
while((*dest++=*src++)!='')
;
return tmp;
}
我的代码中dest和src都是指向同一字符串,当执行while((*dest++=*src++)!='')时,
那样不是把同一字符串中前一个位置的值不断的拷贝到下一个位置,要是这样的话那岂不是
永远不会遇到''了?是不是有什么副本之类的东西在里面,希望有人能帮我详细讲讲里面的实现机制.
还有个问题while((*dest++=*src++)!='')这条语句中dest和src谁先执行自增操作?
char str[3]="1";
strcat(str,str);
str[0]='0'; //执行完这步完后,调试得str值为"01";
char s[3]="1";//str值还为"01";
strcat(s,s);//执行完这步完后,str值却变成了为"111";
这是为什么呢?(以上代码在VC6.0下都不会出现这种问题)
第二个问题:
后来我查看了linux下strcat()的源码,如下:
char *strcat(char *dest,const char *src)
{
char *tmp=dest;
while(*dest)
dest++;
while((*dest++=*src++)!='')
;
return tmp;
}
我的代码中dest和src都是指向同一字符串,当执行while((*dest++=*src++)!='')时,
那样不是把同一字符串中前一个位置的值不断的拷贝到下一个位置,要是这样的话那岂不是
永远不会遇到''了?是不是有什么副本之类的东西在里面,希望有人能帮我详细讲讲里面的实现机制.
还有个问题while((*dest++=*src++)!='')这条语句中dest和src谁先执行自增操作?
|
第一个问题听不太明白(后半部分).
第二个问题,while((*dest++=*src++)!=''),这就看运算符的优先级,优先级高到低:小括号 , ++ , * , != , =
并且是按从左到右的原则,应该是dest先执行自增.dest和src即使原先指向同一字符串,但第一个while后,dest已经指向了字符串的尾部,不会是"那样不是把同一字符串中前一个位置的值不断的拷贝到下一个位置".内部小括号中的表达式的值就等于*src++后的值,当到字符串的尾部后,自然就等于''了.
第二个问题,while((*dest++=*src++)!=''),这就看运算符的优先级,优先级高到低:小括号 , ++ , * , != , =
并且是按从左到右的原则,应该是dest先执行自增.dest和src即使原先指向同一字符串,但第一个while后,dest已经指向了字符串的尾部,不会是"那样不是把同一字符串中前一个位置的值不断的拷贝到下一个位置".内部小括号中的表达式的值就等于*src++后的值,当到字符串的尾部后,自然就等于''了.
|
char str[3]="1";
strcat(str,str); //执行后str为"11"
str[0]='0'; //执行完这步完后,调试得str值为"01"; 修str[0]后,str为"01"这没什么问题.
char s[3]="1";//str值还为"01"; 不知道你标明这是什么意思,str跟s有什么关系?
strcat(s,s);//执行完这步完后,str值却变成了为"111"; s跟str似乎没什么关联吧.这是为什么呢?(以上代码在VC6.0下都不会出现这种问题)
strcat(str,str); //执行后str为"11"
str[0]='0'; //执行完这步完后,调试得str值为"01"; 修str[0]后,str为"01"这没什么问题.
char s[3]="1";//str值还为"01"; 不知道你标明这是什么意思,str跟s有什么关系?
strcat(s,s);//执行完这步完后,str值却变成了为"111"; s跟str似乎没什么关联吧.这是为什么呢?(以上代码在VC6.0下都不会出现这种问题)