| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1352 人关注过本帖
标题:关于C语言函数strcat的问题
只看楼主 加入收藏
java_haier
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2018-3-24
结帖率:100%
收藏
 问题点数:0 回复次数:2 
关于C语言函数strcat的问题
char *strcat(char *s, char *t){
    char *q = s;
    printf("q = %p\t*q = %c\ns = %p\t*s = %c\n", q, *q, s, *s);//指针赋值之前分别打印q, *q, s, *s的值
    while (*s)
        s++;
    while (*s++ = *t++)
        ;
     printf("q = %p\t*q = %c\ns = %p\t*s = %c\n", q, *q, s, *s);//指针赋值之后分别打印q, *q, s, *s的值
    return q;
}
然后运行:
int main(){
    char str[] = "123\0";
    char str2[] = "abc\0";
    strcat(str, str2);
    return 0;
}
运行结果:
q = 0019FC1C    *q = 1
s = 0019FC1C    *s = 1
q = 0019FC1C    *q = 1
s = 0019FC2C    *s =           //此处为空字符
所以,根据结果,指针q指向的地址始终为s第一个字符的内存地址,并且*q始终等于s的第一个字符
但是,将打印语句去掉,即写成:
char *strcat(char *s, char *t){
    char *q = s;
    while (*s)
        s++;
    while (*s++ = *t++)
        ;
    return q;
}
然后调用函数:
int main(){
    char str[] = "123\0";
    char str2[] = "abc\0";
    printf("%s\n", strcat(str, str2));
    return 0;
}
运行结果:123abc
所以我不明白的是:
既然函数strcat的返回值是q,调用函数以后,
为什么结果不是等于s的第一个字符,而是返回两个字符串连接后的新字符串?
搜索更多相关主题的帖子: 函数 strcat char while return 
2018-03-24 14:44
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1744
专家分:3216
注 册:2015-12-2
收藏
得分:0 
q是一个字符指针,打印字符串时遇到\0时停止。
    printf("%c\n", *strcat(str, str2));这样打印才是第一个字符。
2018-03-24 15:43
java_haier
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2018-3-24
收藏
得分:0 
回复 2楼 ehszt
您好,非常感谢您的答复!
我好像明白了。
以下是我的理解:
首先看 printf("%c\n", *strcat(s, t));
如果这样打印,其实打印的是*q,按照我问题当中的描述,*q的值始终等于s的第一个字符,所以打印出来就是s的第一个字符
再看  printf("%s\n", strcat(s, t));
这样打印的话,其实打印的是q
首先q指向的是s的地址,接着s在赋值操作*s++ = *t++之后,s的地址里面的值就变成了s和t两个字符串连接后的新字符串
而q始终指向s的地址,所以q的地址里面的值也就是s和t两个字符串连接后的新字符串
最后格式化打印成%s,即打印为字符串,也就相当于是取q地址里面的值


2018-03-24 16:33
快速回复:关于C语言函数strcat的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014726 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved