将简单循环转换为do-while
我如何将以下while循环转换为正确的循环do-while而不第一次重复计算?
void ctype()
{
char c;
while ((c = getchar()) != '.')
printf("'%c' is %s a letter.n", c, isalpha(c)? "indeed" : "not");
printf("'%c' is %s a letter.n", c, isalpha(c)? "indeed" : "not");
}
到目前为止我所拥有的是:
void ctype()
// Print the letters up through the period, but quit on the period
{
char c = getchar();
do {
printf("'%c' is %s a letter.n", c, isalpha(c)? "indeed" : "not");
} while ((c = getchar()) != '.')
}
但是这个 double-getchar在第一项上。这样做的正确方法是什么?这几乎就像我想要getchar()在 while 循环中的后增量等效。
while循环的示例输入/输出,目前是正确的:
$ run
.
'.' is not a letter.
$ run
Hello.
'H' is indeed a letter.
'e' is indeed a letter.
'l' is indeed a letter.
'l' is indeed a letter.
'o' is indeed a letter.
'.' is not a letter.
回答
可以这样做:
char c;
do {
c = getchar();
printf("'%c' is %s a letter.n", c, isalpha(c)? "indeed" : "not");
} while(c != '.');
在一般情况下,您可以随时更改
while(<expr>) {
// Body
}
到
do {
if(<expr>) break;
// Body
} while(1);
请注意,这仅用于简单地转换为 do-while。代码中还有其他缺陷。同时纠正这些:
int c;
do {
c = getchar();
if(c == EOF) break;
printf("'%c' is %s a letter.n", c, isalpha(c)? "indeed" : "not");
} while(c != '.');
- @David542 Otherwise you cannot check for EOF
回答
另一种检查两者'.'并且EOF不重复调用getchar或 的方法printf。
int c;
while ((c = getchar()) != EOF)
{
printf("'%c' is %s a letter.n", c, isalpha(c)? "indeed" : "not");
if(c == '.') break;
}