2

可能重复:
“while(*s++ = *t++)”是如何工作的?

在一次采访中,我有以下问题。有人可以向我解释一下吗?

void question( char *s, char *t)
{
  while (*s++ = *t++);
}
4

3 回答 3

4

它在您的程序中引入了一个巨大的安全漏洞。在任何情况下都不要编写或使用这样的代码。

如果我们分解代码,我们会得到:

  • *t++读取 指向的字符t,并递增t; 表达式的值是读取的字符。
  • *s++ = expression将该字符写入 wheres点,并递增s;表达式的值是写入的字符。
  • while (expression);只要表达式的值非零,就会一直循环;在这种情况下,直到我们写了一个值为零的字符。

所以该函数不断地从tto复制字符,s直到它到达一个零值字符。没有办法判断s指向是否足够大的数组来容纳这些,所以通常它会写到数组的末尾并导致未定义的行为;从没有不良影响的微妙行为到崩溃,再到执行恶意代码。

如果您事先知道(上限)将复制多少个字符,则只能调用此函数;如果您知道这一点,那么(通常)有比检查每个数据的值更有效的方法来复制数据。因此,您应该(几乎)永远不要使用这个函数,或者strcpy它所近似的 C 库函数 ( )。

这种使用零值字符来终止字符串是 C 语言中的常见习惯用法。std::string在 C++ 中,使用类来表示字符串通常更方便。在这种情况下,等效代码将是简单s = t的,它将安全地管理字符串的内存。

于 2012-08-30T07:17:29.753 回答
3

复制字符串,指针指向t内存,指针指向s


operator=将返回分配的值。t应该指向一个 -NULL终止的字符串,并且s应该指向内存,足够大以存储该字符串。

因此,while当被击中时循环将停止\0,这是字符串的结尾,由 . 指向t。在此while循环中,所有字符(不同于\0)都t将被复制到s.


稍微扩展一下,和下面的一样:

while( *t != '\0' ) // while the current char is not NULL
{
    *s = *t; // copy it into s
    ++s; // increment s, to point to the next byte
    ++t; // increment t, to point to the next char, that will be copied
}
*s = *t; // copy the last char of t - the '\0'
于 2012-08-30T06:57:46.887 回答
2

它将以 null 结尾的字符串复制ts. 语义为strcpy.

于 2012-08-30T06:58:22.677 回答