【发布时间】:2009-06-20 19:46:32
【问题描述】:
我开始通过阅读 K&R 并完成一些练习来学习 C。经过一番折腾,我终于用下面的代码完成了练习1-19:
/* reverse: reverse the character string s */
void reverse(char s[], int slen)
{
char tmp[slen];
int i, j;
i = 0;
j = slen - 2; /* skip '\0' and \n */
tmp[i] = s[j];
while (i <= slen) {
++i;
--j;
tmp[i] = s[j];
}
/* code from copy function p 29 */
i = 0;
while ((s[i] = tmp[i]) != '\0')
++i;
}
我的问题是关于将tmp 字符数组复制到s 的最后一段代码。为什么简单的s = tmp; 不起作用?为什么必须逐个索引地遍历数组复制?
【问题讨论】:
-
K&R 没有使用您的解决方案 - 他们为 C89 而不是 C99 编写,但您的解决方案使用了仅在 C99 中添加的 VLA(可变长度数组)。此外,不能保证字符串中有换行符 - AFAIK。并且按照惯例,字符串的长度已经排除了终端空值。这意味着您的“-2”可能不正确。第一个 while 循环中的条件应使用 '
-
感谢您的洞察力。你是对的,我今天早上在考虑 -2,因为那是我昨晚凌晨 3 点为了让它工作而做的一个 hack。我可能应该在第一个 while 循环中放一个 if (s[i] != '\n' || s[i] != '\0') 。
-
旧评论,但 (s[i] != '\n' || s[i] != '\0') 始终为真。
-
没有合乎逻辑的答案 - 完全有可能将这样的功能添加到语言中 - 实际上我目前正在使用修改后的 gcc 编译器,即使类型不兼容也接受数组和结构分配(因为谁有时间写愚蠢的演员表)。
-
你甚至可以做类似
char arr[20] = *p;的事情,因为*p是一个左值。更改花了我大约 5 分钟的时间 - 我只添加了一个if。