//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循环。或者,如果可以的话,该怎么做。
答案 0 :(得分:3)
如 5.2.4.1转换限制<中所述,在C中嵌套至少{127}级别的for
和do
/ while
等各种复合语句/ strong>。
问题不是语法问题,而是概念性问题:
您的do
/ while
循环在恒定条件下进行迭代,因为i
或sent
都没有在正文中或在循环条件下被修改,如果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] == ' '
时终止。您的程序中有错误,但与嵌套循环的有效性无关。