C ++面试功能

时间:2012-08-30 06:57:05

标签: c++

  

可能重复:
  How does “while(*s++ = *t++)” work?

我在面试时遇到了以下问题。有人可以向我解释一下吗?

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

3 个答案:

答案 0 :(得分:4)

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

如果我们打破代码,我们会得到:

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

因此该函数不断将字符从t复制到s,直到达到零值字符。没有办法判断s是否指向一个足够大的数组来保存它们,因此通常它会超出数组的末尾并导致未定义的行为;任何从微妙的行为,没有不良影响,崩溃,恶意代码的执行。

如果事先知道(上限)将复制多少个字符,则只能调用此函数;如果你知道,那么(通常)有更复杂的数据来复制数据,而不是检查每个数据的价值。因此,您(几乎)不应该使用此函数或它所接近的C库函数(strcpy)。

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

答案 1 :(得分: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'

答案 2 :(得分:2)

它将以空字符结尾的字符串t复制到s中。语义为strcpy