问题(指针基础):字符串复制函数返回复制后字符串首地址值,无法打印该字符串

王利润 2020-12-20 11:34:54
#include<stdio.h>
char *strcopy(char *t,const char *s)
{
while(*t++=*s++);
return t;

}
int main(void)
{
char h1[100],h2[100],h3[100];
char *s1,*s2,*s3;
s1=h1;
s2=h2;
s3=h3;
scanf("%s",s2);
s3=strcopy(s1,s2);
printf("%s\n",s3);
return 0;

}

代码如上,无打印值,将16行改为
strcopy(s1,s2); s3=s1;

就有打印值了?求各位大神说明下,谢谢!
...全文
169 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
王利润 2020-12-23
  • 打赏
  • 举报
回复
谢谢楼上的各位,问题解决了!!!
往事如烟0819 2020-12-20
  • 打赏
  • 举报
回复
1. s3 指向的地址空间 h3[100], 没有被初始化。 重点 局部变量,数组, 必须在使用前,进行初始化。 原因 局部变量的初始值不定, 很危险。(从栈空间分配, 其值为上次别人剩下的值)
qzjhjxj 2020-12-20
  • 打赏
  • 举报
回复
#include<stdio.h>
char *strcopy(char *t,const char *s)
{
    char *temp = t;
    while(*temp++=*s++);//temp s 中记录的地址值是在增加变化
    return t; //返回的地址值是字符串首地址不变的

}

int main(int argc, char* argv[])
{

    char h1[100],h2[100],h3[100];
    char *s1,*s2,*s3;
    s1=h1;
    s2=h2;
    s3=h3; // 这里 s3 -> h3[100]的地址
    scanf("%s",s2);
    s3=strcopy(s1,s2);//这里 s3 -> s1的地址,即h1[100]的地址。
    printf("%s\n",s3);
    return 0;

}
//程序执行完,h1[100]和h2[100]的内容一致,h3[100]并没有变化。
qzjhjxj 2020-12-20
  • 打赏
  • 举报
回复
楼主,程序修改下,是否更容易让你理解,指针只是记录地址的一个变量。
#include<stdio.h>
char *strcopy(char *t,const char *s)
{
    char *temp = t;
    while(*temp++=*s++);
    return t;

}

int main(int argc, char* argv[])
{

    char h1[100],h2[100],h3[100];
    char *s1,*s2,*s3;
    s1=h1;
    s2=h2;
    s3=h3;
    scanf("%s",s2);
    s3=strcopy(s1,s2);
    printf("%s\n",s3);
    return 0;

}
forever74 2020-12-20
  • 打赏
  • 举报
回复
是啊,你return的那个t已经漂移了好远。 很契合 刻舟求剑 哦。
真相重于对错 2020-12-20
  • 打赏
  • 举报
回复
char *strcopy(char *t,const char *s) { while(*t++=*s++); return t;//这里的t已经指向了传进来数据的尾部了 }
内容概要:本文系统介绍了排列组合的基本概念、发展历程及其核心原理,涵盖加法原理与乘法原理、排列(无重复、可重复、有限制条件、环状)、组合(普通组合、可重复组合、分组问题)的定义与计算方法,并深入讲解了二项式定理、容斥原理及错位排列等重要理论。文章还详细阐述了排列组合在概率统计、计算机科学、运筹学、工程技术、生物信息学等多个领域的广泛应用,并提供了识别问题类型、分类分步、正难则反、特殊优先、相邻捆绑、不相邻插空、隔板法等实用解题技巧,帮助读者掌握常见问题的解决思路。; 适合人群:具备高中及以上数学基础,正在学习离散数学、概率统计或准备参加数学竞赛的学生,以及从事计算机、数据科学、工程优化等相关工作的专业人员;尤其适合希望夯实组合数学基础、提升逻辑思维与问题建模能力的学习者。; 使用场景及目标:①理解排列与组合的本质区别及适用条件;②掌握加法原理、乘法原理、容斥原理和二项式定理的核心思想与应用场景;③熟练运用捆绑法、插空法、隔板法、间接法等技巧解决实际计数问题;④为后续学习概率论、算法设计、密码学等高阶课程打下坚实基础。; 阅读建议:建议结合具体例题逐步理解各原理的推导过程,重点区分“有序”与“无序”、“分类”与“分步”的应用场景,注意避免重复计数或漏算情况;对于复杂问题应多练习分类讨论与递推建模,强化抽象思维与逻辑严谨性。
内容概要:本文系统介绍了链表这一重要的线性数据结构,涵盖其基本概念、核心操作、时间复杂度分析、主要类型(单链表、双向链表、循环链表、双向循环链表)及其适用场景。文章详细阐述了链表在插入、删除、查找、访问和遍历等方面的操作特点,强调其动态内存管理和高效插入删除的优势,同时指出其随机访问效率低的不足。结合实际应用,如LRU缓存、队列栈实现、哈希冲突处理、操作系统资源管理等,展示了链表的广泛用途。此外,还总结了哨兵节点、头尾指针优化、指针操作顺序等关键技巧,并对比了链表与数组的性能差异,列举了链表经典算法题及多语言实现差异,全面构建了链表的知识体系。; 适合人群:具备一定数据结构基础,正在准备算法面试或希望深入理解底层原理的程序员,尤其适合工作1-3年、从事后端开发或系统编程的研发人员。; 使用场景及目标:①理解链表与数组的本质区别及选型依据;②掌握链表的核心操作与常见算法(如反转、快慢指针、环检测、合并有序链表等)的设计与实现;③在实际项目中合理运用链表优化性能,如实现高效缓存、动态集合或系统级资源管理; 阅读建议:学习时应结合代码实践,重点理解指针操作的逻辑顺序与边界处理,推荐动手实现各类链表结构并刷练相关算法题以巩固理解。

70,038

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧