我在面试中有以下问题。有人可以向我解释吗?
void question(char *s, char *t)
{
while (*s++ = *t++);
}
我在面试中有以下问题。有人可以向我解释吗?
void question(char *s, char *t)
{
while (*s++ = *t++);
}
复制串,由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'
你的循环和紧凑的循环是不一样的。你的不会复制终止字符串的空字符。紧凑的一个。 –
@DavidHammen - 谢谢,你是对的。 –
也相当于易读(但很可能风格差,因为我们恨'break',它希望我们的precioussss):'而(1){* S = * T;如果(* s == 0)中断; ++ S; ++吨}'。 Kiril的循环和我的循环之间还有另一个细微的差别,在另一个问题上循环,在这种情况下并不重要,因为函数立即退出:我们将's'和't'指向nul终结者,而问题中的循环使他们超越它。 –
它在您的程序中引入了一个巨大的安全漏洞。在任何情况下都不要编写或使用这样的代码。
如果我们打破代码下来,我们得到:
*t++
读取字符由t
指出,和增量t
;表达式的值是被读取的字符。*s++ = expression
将该字符写入s
分,并增加s
;表达式的值是写入的字符。while (expression);
只要表达式的值不为零,就保持循环;在这种情况下,直到我们写了一个值为零的字符。因此,该功能会将字符从t
复制到s
,直到达到零值字符。没有办法知道s
是否指向一个足够大的数组来保存这些数据,因此通常它会写入超出数组末尾并导致未定义的行为;任何细微的行为,没有不需要的影响,崩溃,执行恶意代码。
如果您事先知道(上限)多少个字符将被复制,您只能调用此函数;如果你知道这一点,那么通常有更有效的方法来复制数据,而不是检查每个数据的值。因此,您应该(几乎)不使用此函数或它近似的C库函数(strcpy
)。
此使用一个零值的字符终止的字符串是在C常见的成语;在C++中,使用std::string
类代表字符串通常会更方便。在这种情况下,等效代码将只是s = t
,这将安全地管理字符串的内存。
“如果您事先知道将复制多少个字符,则只能调用此函数” - false。如果您事先不知道字符的确切数量,您可以使用它,但知道一个上限。 –
@SteveJessop:是的,我虽然关于增加资格,但没有打扰。现在我真的应该知道,我无法在这个网站上简化。 –
我们一直在看,我们的学生。我怀疑(但不能证明),在极少数情况下,你真的会考虑像这样使用它,你无论如何都会想要'stpcpy'而不是'strcpy',因为'strcpy'的返回值'旁边没用。 –
他们通过寻求在C++采访:)一个C的问题骗你。 C++使用'的std :: string',很少'字符*' –
http://stackoverflow.com/questions/810129/how-does-whiles-t-work看到这个 –
问题是什么,你想解释呢? – jalf