对不好的双关语抱歉:P
我编写了HAL => IBMC中的旧技巧.我刚读完了K&R中的前几页,我认为这对他们来说是一个很好的第一次播放.
char evil[] = "HAL";
char *ptr = evil;
for (int i = 0; i < strlen(evil); ++i, ++ptr) {
(*ptr)++;
}
printf("%s\n", evil); // IBM
Run Code Online (Sandbox Code Playgroud)
我的问题是,我有两个变量递增,i并且ptr,有些东西告诉我其中一个是多余的(也许我仍然没有想到 C足够好).
我使用的唯一原因i是确定我们是否已读到字符串的末尾.有没有办法检查指针,看它是否已到达字符串的末尾?
对不起任何实际问题的混淆.通过我错过了我基本上意味着什么,当我需要一个递增索引来检查长度时,为什么我会使用指针.我可以使用该索引从数组中下标右边的char.
teu*_*kam 11
你也可以写
for (char *ptr = evil; *ptr != '\0' ; ++ptr)
Run Code Online (Sandbox Code Playgroud)
我输入了问题,重新阅读,然后意识到我忽略了一些非常明显的事情!
char evil[] = "HAL"
char *ptr = evil;
for (; *ptr != '\0'; ++ptr) {
(*ptr)++;
}
printf("%s\n", evil);
Run Code Online (Sandbox Code Playgroud)
这似乎成功了.
您已经找到了正确的实现,但我仍然想对您的原始代码提出一点意见,这可能会让您以不同的方式思考这些问题.
您的原始解决方案可能比您想象的更糟糕,因为它的复杂性实际上是O(n ^ 2),其中n是字符串的长度. strlen()具有O(n)的复杂度,因为它必须迭代字符串中的所有字符,直到找到它为止'\0'.所以你有一个执行n次迭代的循环,strlen()每次都调用,导致O(n ^ 2)的复杂性.
至少你应该strlen()在循环之前调用一次,并缓存字符串的长度.当然,你有正确的解决方案,根本不打电话strlen().