鱼C论坛

 找回密码
 立即注册
查看: 1556|回复: 10

[已解决]到底是哪里出了问题呢,执行到将a复制到b这一步后面的就不打印了,但是编译器并没...

[复制链接]
发表于 2020-9-2 11:11:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<stdio.h>
  2. int main()
  3. {
  4.     void copy_string(char *from, char *to);
  5.     char *a = "I am a taecher";
  6.     char *b = "I am a stduent";
  7.    
  8.    

  9.     printf("string a =%s\n", a);
  10.     printf("string b =%s\n", b);
  11.     printf("将a复制到b\n");
  12.     copy_string(a,b);
  13.     printf("string a =%s\n", a);
  14.     printf("string b =%s\n", b);
  15.     return 0;
  16. }
  17. void copy_string(char *from, char *to)
  18. {
  19.     while((*to++=*from++)!='\0')
  20.         ;
  21. }
复制代码

到底是哪里出了问题呢,执行到将a复制到b这一步后面的就不打印了,但是编译器并没有报错呀
最佳答案
2020-9-2 11:15:54
本帖最后由 baige 于 2020-9-2 11:25 编辑

字符指针变量指向的字符串常量中的内容是不能修改(不能对它在赋值)

  1. #include<stdio.h>
  2. int main()
  3. {
  4.     void copy_string(char *from, char *to);
  5.     char a[] = "I am a taecher";
  6.     char b[] = "I am a stduent";

  7.     printf("string a =%s\n", a);
  8.     printf("string b =%s\n", b);
  9.     printf("将a复制到b\n");
  10.     copy_string(a,b);
  11.     printf("string a =%s\n", a);
  12.     printf("string b =%s\n", b);
  13.     return 0;
  14. }
  15. void copy_string(char *from, char *to)
  16. {
  17.     while((*to++=*from++)!='\0')
  18.         ;
  19. }

复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-9-2 11:15:54 | 显示全部楼层    本楼为最佳答案   
本帖最后由 baige 于 2020-9-2 11:25 编辑

字符指针变量指向的字符串常量中的内容是不能修改(不能对它在赋值)

  1. #include<stdio.h>
  2. int main()
  3. {
  4.     void copy_string(char *from, char *to);
  5.     char a[] = "I am a taecher";
  6.     char b[] = "I am a stduent";

  7.     printf("string a =%s\n", a);
  8.     printf("string b =%s\n", b);
  9.     printf("将a复制到b\n");
  10.     copy_string(a,b);
  11.     printf("string a =%s\n", a);
  12.     printf("string b =%s\n", b);
  13.     return 0;
  14. }
  15. void copy_string(char *from, char *to)
  16. {
  17.     while((*to++=*from++)!='\0')
  18.         ;
  19. }

复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-2 11:42:05 | 显示全部楼层
  1. #include<stdio.h>
  2. int main()
  3. {
  4.     void copy_string(char *from, char *to);
  5.     char *a = "I am a taecher";
  6.     char *b = "I am a stduent";
  7.    
  8.    

  9.     printf("string a =%s\n", a);
  10.     printf("string b =%s\n", b);
  11.     printf("将a复制到b\n");
  12.     copy_string(&a,&b); // 传地址
  13.     printf("string a =%s\n", a);
  14.     printf("string b =%s\n", b);
  15.     return 0;
  16. }
  17. void copy_string(char *from, char *to)
  18. {
  19.     while((*to++=*from++)!='\0')
  20.         ;
  21. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-2 12:16:42 | 显示全部楼层
baige 发表于 2020-9-2 11:15
字符指针变量指向的字符串常量中的内容是不能修改(不能对它在赋值)

你的答案是正确的,但我有一个问题没弄明白,我逐条逐条执行也没看出来,故而请教:while循环,明明是空语句,为什么能完成拷贝任务?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-2 12:17:24 | 显示全部楼层
风过无痕1989 发表于 2020-9-2 12:16
你的答案是正确的,但我有一个问题没弄明白,我逐条逐条执行也没看出来,故而请教:while循环,明明是空 ...

*to++=*from++
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-2 12:32:55 | 显示全部楼层

你的程序虽然执行没有问题,可以完成拷贝任务,但在编译时,有告警:warning C4047: 'function' : 'char *' differs in levels of indirection from 'char ** '好像是:'char'与'char**'不同级别。

我是初学,两个月里《带你学C带你飞》教学视频看了三遍,看完了谭浩强的《C语言程序设计》第四版,对指针、字符串的操作还是没有一个清晰的概念,于是,现在刚开始啃《C与指针》这本书。
请不吝赐教:既然级别不同,为何还能正常完成拷贝任务?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-2 15:03:39 | 显示全部楼层
本帖最后由 Cool_Breeze 于 2020-9-2 16:33 编辑
风过无痕1989 发表于 2020-9-2 12:32
你的程序虽然执行没有问题,可以完成拷贝任务,但在编译时,有告警:warning C4047: 'function' : 'char  ...

  1. #include<stdio.h>
  2. int main()
  3. {
  4.     void copy_string(char *from, char *to);
  5.     char *a = "I am a taecher"; //const char *a = "I am a taecher"; 这样写会更好一些,指向常量的指针
  6.     char *b = "I am a stduent"; //const char *b = "I am a taecher";
  7.        
  8.         printf("a = %#X\n", a) ; // a = 0X404000
  9.         printf("b = %#X\n", b) ; // b = 0X40400F
  10.     printf("string a =%s\n", a);
  11.     printf("string b =%s\n", b);
  12.     printf("将a复制到b\n");
  13.     copy_string(&a,&b);
  14.    
  15.         printf("string a =%s\n", a);
  16.     printf("string b =%s\n", b);
  17.    
  18.     printf("a = %#X\n", a) ; // a = 0X404000
  19.         printf("b = %#X\n", b) ; // b = 0X404000
  20.     return 0;
  21. }
  22. void copy_string(char *from, char *to)
  23. {
  24.         //这里只是改变了指针b指向的地址 相当于 b=a
  25.     while((*to++ = *from++) != '\0');
  26. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-2 15:25:02 | 显示全部楼层

我明白了,只是改变指针指向的地址,谢谢兄弟 !

不过,你可能写得太急了,最后一个条件少写了一层括号:

while(     (*to++=*from++)    !='\0')
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-2 15:30:24 | 显示全部楼层
风过无痕1989 发表于 2020-9-2 15:25
我明白了,只是改变指针指向的地址,谢谢兄弟 !

不过,你可能写得太急了,最后一个条件少写了一层括 ...

是啊,加上了,要仔细啊!
常量 一开始就是固定的,如果要修改它,就不应该使用常量,这会出现逻辑上的错误!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-2 16:28:50 From FishC Mobile | 显示全部楼层
风过无痕1989 发表于 2020-9-2 15:25
我明白了,只是改变指针指向的地址,谢谢兄弟 !

不过,你可能写得太急了,最后一个条件少写了一层括 ...

这就是常量指针和指针常量的区别吧(⊿)慢慢绕,苍天饶过谁,绕出来你就明白了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-2 16:43:57 | 显示全部楼层
Neverturnback 发表于 2020-9-2 16:28
这就是常量指针和指针常量的区别吧(⊿)慢慢绕,苍天饶过谁,绕出来你就明白了

在指针这个问题上,我已经绕了近一个月了,反反复复看书、理解、看书、理解,还是一知半解的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-15 19:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表