繁体   English   中英

仅读取行的第一个字符

[英]Reading Only the First Character of a Line

我编写了一个程序,使用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时,程序将所有字符打印在奇数位置(第一个,第三个,第五个...),而不是仅打印第一个字符。 我不知道为什么

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

输入:“示例”

  1. 调用ch = getchar()并捕获“ E”,并打印ch并打印“ E”。
  2. 调用getchar(),获取“ x”。 什么都没有打印。
  3. 调用ch = getchar()并获取“ a”,并打印ch并显示“ a”。
  4. 调用getchar(),获取“ m”。 什么都没有打印。
  5. ch = getchar()被调用,抓住“ p”,并且ch被打印,打印“ p”。
  6. 调用getchar(),获取“ l”。 什么都没有打印。
  7. 调用ch = getchar()并抓住“ e”,然后打印ch并打印“ e”。

看看如何运作?

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

如果将while更改为if ,则它仅读取一个字符,然后继续进行外循环。 这就解释了为什么将所有这些字符放在不同的位置。

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

if是条件构造,请while循环构造时注意id。 if里面的任何东西都只会执行一次。

  1. 调用getchar():每次调用getchar()时,程序都会从​​输入中读取一个字符。
  2. While vs. if:正如其他人所提到的。
  3. 继续:继续传输到do,for或while循环。

当您有一秒钟的时间时,这就是您继续进行的地方。 但是,如果您遇到的话,继续操作会将您带到第一时间。 然后,您有2次对getchar()的调用,导致读取了奇数个位置。

您应该尝试分步调试以更好地理解。

第二个WHILE循环将执行直到看到'\\ n'字符为止。 由于调用CONTINUE时,控制权转到了第二个WHILE循环本身。 因此,它仅打印第一个字符。

但是,如果将第二个WHILE循环替换为IF循环,则在调用CONTINUE时,控制转到第一个WHILE循环。 这里也调用了getchar() 因此它将打印字符保持在奇数位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM