【问题标题】:Loops in C challenge: can it be done another way?C 挑战中的循环:可以用另一种方式完成吗?
【发布时间】:2011-05-18 21:43:06
【问题描述】:

大家好 C 专家(请不要开枪,我不再是 C 程序员了,但我时不时会想到一个问题)

我正在阅读另一个问题 (How to print an entered string backwards in C using only a for loop)。

“最简单”和最合乎逻辑的答案是

for (x = end; x >= 0; --x) {
    printf("%c", word[x]);
}

但我想知道是否没有办法实现相同的目标,但更接近原来的循环:

for (x = word[end]; x >= word[0]; x--) {
    printf("%c", x);
}

我对 C 的了解不够多,无法解决这个问题,但我们不能用数组指针来循环播放

char * wordp;
for(wordp = &word[end]; /*something*/; wordp--){\
   printf("%c", &wordp);
}

P.S.:我真的不在乎它是向前还是向后循环。

P.P.S.:对不起,如果我在指针中犯了明显的 C 错误;在评论中指出它们,我会编辑它们。 ;)

杰森

【问题讨论】:

  • 当然可以,而且它可能更有效,因为在某些架构上增量比添加更快。不过,一个好的编译器应该使用这两种方法生成相同的代码。

标签: c algorithm loops


【解决方案1】:

绝对的。

char *wordp;

for(wordp = word + end; wordp >= word; wordp--){
   printf("%c", *wordp);
}

【讨论】:

  • ... 这就是 STL 迭代器的使用方式
  • 我必须说我不得不佩服 C :P 的可能性。我缺少的是如何比较 wordp >= word,我知道指针基本上是数字并且可以进行比较,但我不知道它们必须在数组中从小到大排序(听起来合乎逻辑,哈哈)。这个技巧可以与动态数组/列表一起使用吗?实际上 >= 是必要的吗?你能简单地说一下 == 吗?
  • @Jason:由于结构和循环的性质,我们需要将其视为边界条件,而不是事件条件。
  • 请注意,您实际上每次迭代都会保存一个加法!
【解决方案2】:
for (x = word[end]; x >= word[0]; x--) {
    printf("%c", x);
}

不起作用,因为 word[end] 等价于 *(word + end)。它已经被取消引用,所以 x 将被设置为最后一个 char 的值,并将循环直到它等于第一个 char 的 char 值。总之,没有意义。

试试:

char * wordp;
for(wordp = (word + end); wordp >= word; wordp--){\
   printf("%c", *wordp);
}

请记住,数组只是指向其第一项的指针。

【讨论】:

    【解决方案3】:

    你可以这样做:

        char * wordp;
        for(wordp = &word[end]; wordp >= word ; wordp--){\
                printf("%c", *wordp);
        }
    

    【讨论】:

    • @aschepler:很好。谢谢。
    【解决方案4】:

    真正的程序员使用递归:

    void revputs(char *s) {
      if (*s) { revputs(s + 1); putchar(*s); }
    }
    

    【讨论】:

    • 真正的程序员在需要时使用递归,他们觉得没有必要吹嘘它。否则很好的解决方案^^
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    相关资源
    最近更新 更多