在for循环中使用do-while循环是否正确?为什么和为什么不呢?

时间:2019-06-27 02:48:15

标签: c for-loop do-while

//program to count words
#include<stdio.h>
int main()
{
    int i;
    int word = 0;
    char sent[] = "How are you doing mister";  //character pointer
    for (i = 0; sent[i] != '\0'; i++)
    {
        do
        {
            word++;

        } while (sent[i] == ' ');
    }
    printf("There are %d words in the sentence\n", word + 1);  //words are always 1 more than the no. of spaces.
    return 0;                                                  //or word=1;
}

这是用于计算单词数的代码。请告诉我为什么我们不能在for循环中使用do-while循环。或者,如果可以的话,该怎么做。

2 个答案:

答案 0 :(得分:3)

5.2.4.1转换限制<中所述,在C中嵌套至少{127}级别的fordo / while等各种复合语句/ strong>。

问题不是语法问题,而是概念性问题:

  • 您的do / while循环在恒定条件下进行迭代,因为isent都没有在正文中或在循环条件下被修改,如果sent[i]是一个空格,则会导致无限循环。

  • 对空格进行计数不是对字符串中的单词进行计数的正确方法:""包含0个单词,而不是您想要的代码中的1个单词," "也但您会得到2,而"A B"仅包含2个字,而没有3

  • 您应该计算从空间到非空间的转换数,该转换数从字符串开头之前的隐含空格开始。

  • 还请注意,char sent[] = "..."; 不是字符指针,而是字符数组。

这是修改后的版本:

//program to count words
#include <stdio.h>

int main() {
    int i, words, last;
    char sent[] = "How are you doing mister?";

    words = 0;
    last = ' ';
    for (i = 0; sent[i] != '\0'; i++) {
        if (sent[i] != ' ' && last == ' ')
            word++;
        last = sent[i];
    }
    printf("There are %d words in the sentence '%s'\n", words, sent);
    return 0;
}

在我的经验证明阅读代码中,do / while循环往往被错误地编写,尤其是对于初学者,缺少测试条件或以其他方式破坏的循环。我认为do / while循环解决了一个给定的问题,再想想,for循环可能是一种更安全的方法。 do / while循环唯一需要的地方是在宏扩展中,您要将多个语句组合成一个复合语句:

#define swap_ints(a, b)  do { a ^= b; b ^= a; a ^= b; } while (0)

但是请注意,此宏中的交换方法效率低下,并且宏非常容易出错,应避免使用do / while循环:)

答案 1 :(得分:1)

do-while循环嵌套在for循环中是完全有效的。从语法上讲,您的程序没有错。

但是,正如其他人所描述的那样,嵌套循环永远不会在sent[i] == ' '时终止。您的程序中有错误,但与嵌套循环的有效性无关。