鱼C论坛

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

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

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

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

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

x
#include<stdio.h>
int main()
{
    void copy_string(char *from, char *to);
    char *a = "I am a taecher";
    char *b = "I am a stduent";
    
   

    printf("string a =%s\n", a);
    printf("string b =%s\n", b);
    printf("将a复制到b\n");
    copy_string(a,b);
    printf("string a =%s\n", a);
    printf("string b =%s\n", b);
    return 0;
}
void copy_string(char *from, char *to)
{
    while((*to++=*from++)!='\0')
        ;
}
到底是哪里出了问题呢,执行到将a复制到b这一步后面的就不打印了,但是编译器并没有报错呀
最佳答案
2020-9-2 11:15:54
本帖最后由 baige 于 2020-9-2 11:25 编辑

字符指针变量指向的字符串常量中的内容是不能修改(不能对它在赋值)
#include<stdio.h>
int main()
{
    void copy_string(char *from, char *to);
    char a[] = "I am a taecher";
    char b[] = "I am a stduent";

    printf("string a =%s\n", a);
    printf("string b =%s\n", b);
    printf("将a复制到b\n");
    copy_string(a,b);
    printf("string a =%s\n", a);
    printf("string b =%s\n", b);
    return 0;
}
void copy_string(char *from, char *to)
{
    while((*to++=*from++)!='\0')
        ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

字符指针变量指向的字符串常量中的内容是不能修改(不能对它在赋值)
#include<stdio.h>
int main()
{
    void copy_string(char *from, char *to);
    char a[] = "I am a taecher";
    char b[] = "I am a stduent";

    printf("string a =%s\n", a);
    printf("string b =%s\n", b);
    printf("将a复制到b\n");
    copy_string(a,b);
    printf("string a =%s\n", a);
    printf("string b =%s\n", b);
    return 0;
}
void copy_string(char *from, char *to)
{
    while((*to++=*from++)!='\0')
        ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

    printf("string a =%s\n", a);
    printf("string b =%s\n", b);
    printf("将a复制到b\n");
    copy_string(&a,&b); // 传地址 
    printf("string a =%s\n", a);
    printf("string b =%s\n", b);
    return 0;
}
void copy_string(char *from, char *to)
{
    while((*to++=*from++)!='\0')
        ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

*to++=*from++
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

我是初学,两个月里《带你学C带你飞》教学视频看了三遍,看完了谭浩强的《C语言程序设计》第四版,对指针、字符串的操作还是没有一个清晰的概念,于是,现在刚开始啃《C与指针》这本书。
请不吝赐教:既然级别不同,为何还能正常完成拷贝任务?
想知道小甲鱼最近在做啥?请访问 -> 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  ...

#include<stdio.h>
int main()
{
    void copy_string(char *from, char *to);
    char *a = "I am a taecher"; //const char *a = "I am a taecher"; 这样写会更好一些,指向常量的指针
    char *b = "I am a stduent"; //const char *b = "I am a taecher"; 
        
        printf("a = %#X\n", a) ; // a = 0X404000
        printf("b = %#X\n", b) ; // b = 0X40400F
    printf("string a =%s\n", a);
    printf("string b =%s\n", b);
    printf("将a复制到b\n");
    copy_string(&a,&b);
    
        printf("string a =%s\n", a);
    printf("string b =%s\n", b);
    
    printf("a = %#X\n", a) ; // a = 0X404000
        printf("b = %#X\n", b) ; // b = 0X404000
    return 0;
}
void copy_string(char *from, char *to)
{
        //这里只是改变了指针b指向的地址 相当于 b=a
    while((*to++ = *from++) != '\0');
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

while(     (*to++=*from++)    !='\0')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

是啊,加上了,要仔细啊!
常量 一开始就是固定的,如果要修改它,就不应该使用常量,这会出现逻辑上的错误!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

这就是常量指针和指针常量的区别吧(⊿)慢慢绕,苍天饶过谁,绕出来你就明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

在指针这个问题上,我已经绕了近一个月了,反反复复看书、理解、看书、理解,还是一知半解的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 05:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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