只阅读一行的第一个字符

时间:2014-07-25 23:15:56

标签: c

我写了一个程序,通过使用C来读取行中的第一个字符,这是我的代码:

#include <stdio.h>

int main(void) {
    char ch;

    printf("Please type text for test(# for terminate)\n");

    while((ch = getchar()) != '#') {
        printf("\n %c", ch);
        while (getchar() != '\n')
            continue;
        printf("\nPlease type text for test(# for terminate)\n");
    }
    return 0;
}

我的问题是当我将第二个更改为if时,程序会将所有字符打印在奇数位置(第一个,第三个,第五个......)而不是第一个字符。我不知道为什么

5 个答案:

答案 0 :(得分:3)

每次调用getchar()时,它都会从stdin中吃掉一个字符。您在上面的代码中有两次调用getchar(),并且它们是交替的(在您的while()中进行调用,然后在if()中进行调用)。但是,只有第一个调用存储返回的字符并打印它,第二个调用只是吃掉字符而不做任何事情。一个例子:

输入:&#34;示例&#34;

  1. ch = getchar()被调用,抓住&#34; E&#34;和ch打印,打印&#34; E&#34;。
  2. getchar()被调用,抓住&#34; x&#34;。什么都没有打印出来。
  3. ch = getchar()被调用,抓住&#34; a&#34;和ch打印,打印&#34; a&#34;。
  4. getchar()被调用,抓住&#34; m&#34;。什么都没有打印出来。
  5. ch = getchar()被调用,抓住&#34; p&#34;和ch打印,打印&#34; p&#34;。
  6. getchar()被调用,抓住&#34; l&#34;。什么都没有打印出来。
  7. ch = getchar()被调用,抓住&#34; e&#34;和ch打印,打印&#34; e&#34;。
  8. 看看它是如何工作的?

答案 1 :(得分:0)

第二个while循环读取第一个字符后的所有字符,直到按下换行符。换句话说,它读取行的其余部分并忽略它。

如果将while更改为if,则只会读取一个字符,然后继续使用外部循环。这就解释了为什么你把所有这些角色都放在不同的位置上。

答案 2 :(得分:0)

它会忽略其他所有字母。现在,使用第二个while,您将打印第一个字母并忽略该行中的其余字母。将其更改为if您读取每个奇数位置的字母。

保持身份识别while是循环构造,而if是条件构造。 if内的任何内容都只会被执行一次。

答案 3 :(得分:0)

  1. 对getchar()的调用:每次调用getchar()时,程序都会从​​输入中读取一个字符。
  2. 而对于if:正如其他人所说的那样。
  3. 继续:继续转移到do,for或while循环。
  4. 当你有一秒钟的时候,这就是你的继续带你的地方。但是当你有一个if时,继续将你带到第一个。然后你有两次调用getchar(),导致奇数位被读取。

    您应该尝试逐步调试,以便更好地理解。

答案 4 :(得分:0)

第二个 WHILE 循环将执行,直到看到'\ n'字符。因为在调用 CONTINUE 时,控件转到第二个WHILE循环本身。所以它只打印第一个字符。

但是如果第二个WHILE循环被 IF 循环替换,那么当调用CONTINUE时,控件将转到第一个WHILE循环。这里还调用了 getchar()。因此它可以将字符打印在奇数位置。