将简单循环转换为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;
    }


以上是将简单循环转换为do-while的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>