【问题标题】:for loop not operatingfor 循环不运行
【发布时间】:2012-12-07 08:20:40
【问题描述】:

对于一个尴尬(尽管是标准的)问题,我想出了一个我认为是混乱的解决方案: 对于给定的用户输入,反转单词的字母

例如:

这是一个标准测试

变成

sihT si a dradnats tset

而不是

tset dradnats a si sihT

问题的核心是这段代码

  while (!iscntrl(user_input[x])) // quit when new line is read
      {
        restart:
        x++;
        puts("first level test");
        if (user_input[x]==' ')
            {
            puts("second level test");
            for (i=x; user_input[i]!=' '; --i)
                {               
                reverse_words[k]=user_input[i];
                k++;
                puts("third level test");
                goto restart;
                }
            }
        }

(是的,我知道,那里有一个 goto :/)

但循环的第三层从未被触及。

想必(i=x; user_input[i]!=' '; --i)作为for循环参数有什么问题?

x、i 和 k 在第一个循环开始之前都被初始化为整数 == 0。

【问题讨论】:

  • 将反转逻辑分解为函数可能会使此类问题更易于调试。

标签: c for-loop nested-loops


【解决方案1】:

嗯,你的情况在这里矛盾:

 if (user_input[x]==' ')
            {
            puts("second level test");
            for (i=x; user_input[i]!=' '; --i)

只有在user_input[x] 是空格时才输入,但只要不等于空格,就会循环。

【讨论】:

  • 是的,我应该有i=x-1,然后把它作为i--而不是--i....当我遇到一个单词的结尾,我想往回前进,将刚刚结束的单词的字符放入 reverse_word 数组中......而不影响 x(输入数组中的位置)。当遇到的单词已经输入reverse_word数组时,我想回到我离开的地方(在x处)......
  • 虽然现在我想到了......我还需要一个条件来识别输入数组的第一个字符何时被读取(即第一个单词输入)......有点尴尬因为字符串不以空终止符开头:/
  • 您发布的代码,我无法理解整个逻辑。但我建议将整体颠倒,然后将每个单词颠倒。
  • 1.首先将 while 行简单反转:This is a standard test 到 tset dradnats a si sihT 2.然后反转每个单词:sihT si a dradnats tset。
  • 1.从头开始读取字符,直到遇到空格。 2. 一旦空格被击中,就反转单词 3. 继续存储所有空格,就像在击中任何非空格之前一样。 4. 不遇到long nul,重复同样的操作。示例:阅读This 我们现在打了一个空格。反转它并存储:sihT 并继续存储空间:sihT 等等。
【解决方案2】:

问题出在这部分:

 if (user_input[x]==' ')
            {
            puts("second level test");
            for (i=x; user_input[i]!=' '; --i)
                {               

在第一行中,您已经确定了 user_input[x]==' '。

几行之后,您设置了一个循环,该循环将在 user_input[i]!=' ' 时运行。

但是,您已经设置了 i = x... 因此,在第一遍中,您需要 user_input[x]!=' '... 您已经确定为 false。

因此,内部循环永远不会运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 2016-07-18
    • 2023-03-18
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多