c语言 - 字符串复制功能:简单的问题



我有这个函数,它获取两个指向字符串的指针。

void copy(char *s, char *t){    /*copy the string pointed by t into string pointed by s*/
while( (*s = *t) != ''){
s++;
t++;
}
return;
}

问题是:我看到它适用于s++t++(这意味着"指针,转到下一个字符并检查它")以及*s++*t++。所以我问这不应该*s++修改指针指向的字符吗?为什么它的工作原理相同?

用 ubuntu 编译,带有一些示例字符串。 提前致谢

有两个部分。

首先

使用 S++ 和

T++(这意味着"指针,转到下一个字符并检查它")以及 *S++ 和 *T++。

好吧,你看到的结果是一样的,这并不意味着它们是相同的。

如果出现这样的片段

s++;
t++;

*s++;
*t++;

它们产生相同的行为,因为在这两种情况下,只有递增后事项的副作用(因为它们是持久的,会影响实际变量),而不是产生的结果(应用取消引用运算符的结果被丢弃)。

实际上,如果您尝试编译第二个版本(*s++;),您将收到类似

警告:未使用计算的值 [-未使用值]

然后,其次

*s++不应该修改指针指向的字符

否,请阅读运算符优先级。后置增量的绑定高于取消引用运算符的绑定,副作用在结果的值计算后开始,这就是取消引用操作。

对于初学者来说,最好用限定符const声明第二个参数。

void copy(char *s, const char *t);

函数和函数用户之间的协定是函数保证复制的源字符串不会被更改。

最好将函数声明为:

char * copy(char *s, const char *t);

当函数返回指向结果字符串的第一个字符的指针时。

至于最初的问题,那么如果你写的函数像

void copy(char *s, char *t){    /*copy the string pointed by t into string pointed by s*/
while( (*s = *t) != ''){
*s++;
*t++;
}
// return;
}

则不使用表达式*s++*t++的值。因此,在这种情况下,指针的取消引用是冗余操作。

但是,您可以通过以下方式编写函数,其中取消引用有意义

void copy(char *s, char *t){    /*copy the string pointed by t into string pointed by s*/
while( ( *s++ = *t++) != '');
// return;
}

相关内容

  • 没有找到相关文章

最新更新