2012-08-30 25 views
1

可能重复:
How does “while(*s++ = *t++)” work?C++采访函数

我在面试中有以下问题。有人可以向我解释吗?

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

他们通过寻求在C++采访:)一个C的问题骗你。 C++使用'的std :: string',很少'字符*' –

+2

http://stackoverflow.com/questions/810129/how-does-whiles-t-work看到这个 –

+2

问题是什么,你想解释呢? – jalf

回答

3

复制串,由t到存储器指针,通过s指出。


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

所以,while循环停止时\0被击中,这是字符串的结尾,通过t指出。在此while循环中,t中的所有字符(与\0不同)将被复制到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' 
+1

你的循环和紧凑的循环是不一样的。你的不会复制终止字符串的空字符。紧凑的一个。 –

+0

@DavidHammen - 谢谢,你是对的。 –

+0

也相当于易读(但很可能风格差,因为我们恨'break',它希望我们的precioussss):'而(1){* S = * T;如果(* s == 0)中断; ++ S; ++吨}'。 Kiril的循环和我的循环之间还有另一个细微的差别,在另一个问题上循环,在这种情况下并不重要,因为函数立即退出:我们将's'和't'指向nul终结者,而问题中的循环使他们超越它。 –

2

它复制空终止字符串ts。语义为strcpy

+1

除strcpy被声明为char * strcpy(char *,const char *);'。 – john

+4

谢谢约翰,但语义 - 什么功能呢 - 仍然是相同的 - 它会将空终止字符串由第二个参数指出为第一,足够大。 – demi

4

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

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

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

因此,该功能会将字符从t复制到s,直到达到零值字符。没有办法知道s是否指向一个足够大的数组来保存这些数据,因此通常它会写入超出数组末尾并导致未定义的行为;任何细微的行为,没有不需要的影响,崩溃,执行恶意代码。

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

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

+0

“如果您事先知道将复制多少个字符,则只能调用此函数” - false。如果您事先不知道字符的确切数量,您可以使用它,但知道一个上限。 –

+0

@SteveJessop:是的,我虽然关于增加资格,但没有打扰。现在我真的应该知道,我无法在这个网站上简化。 –

+0

我们一直在看,我们的学生。我怀疑(但不能证明),在极少数情况下,你真的会考虑像这样使用它,你无论如何都会想要'stpcpy'而不是'strcpy',因为'strcpy'的返回值'旁边没用。 –