_liziwen 发表于 2020-9-2 11:11:46

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

#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这一步后面的就不打印了,但是编译器并没有报错呀

baige 发表于 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')
      ;
}


Cool_Breeze 发表于 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')
      ;
}

风过无痕1989 发表于 2020-9-2 12:16:42

baige 发表于 2020-9-2 11:15
字符指针变量指向的字符串常量中的内容是不能修改(不能对它在赋值)

你的答案是正确的,但我有一个问题没弄明白,我逐条逐条执行也没看出来,故而请教:while循环,明明是空语句,为什么能完成拷贝任务?

baige 发表于 2020-9-2 12:17:24

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

*to++=*from++

风过无痕1989 发表于 2020-9-2 12:32:55

Cool_Breeze 发表于 2020-9-2 11:42


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

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

Cool_Breeze 发表于 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');
}

风过无痕1989 发表于 2020-9-2 15:25:02

Cool_Breeze 发表于 2020-9-2 15:03


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

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

while(   (*to++=*from++)    !='\0')

Cool_Breeze 发表于 2020-9-2 15:30:24

风过无痕1989 发表于 2020-9-2 15:25
我明白了,只是改变指针指向的地址,谢谢兄弟 !

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

是啊,加上了,要仔细啊!
常量 一开始就是固定的,如果要修改它,就不应该使用常量,这会出现逻辑上的错误!

Neverturnback 发表于 2020-9-2 16:28:50

风过无痕1989 发表于 2020-9-2 15:25
我明白了,只是改变指针指向的地址,谢谢兄弟 !

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

这就是常量指针和指针常量的区别吧(⊿)慢慢绕,苍天饶过谁,绕出来你就明白了

风过无痕1989 发表于 2020-9-2 16:43:57

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

在指针这个问题上,我已经绕了近一个月了,反反复复看书、理解、看书、理解,还是一知半解的
页: [1]
查看完整版本: 到底是哪里出了问题呢,执行到将a复制到b这一步后面的就不打印了,但是编译器并没...