【问题标题】:How should I read one char in C when spaces should be ignored?当空格应该被忽略时,我应该如何读取 C 中的一个字符?
【发布时间】:2014-02-01 19:34:42
【问题描述】:

我应该用 C 创建一个函数,它读取一个字符并返回它。如果读取失败,该函数应返回 0。该函数应忽略空格字符。如果给定的 char 是 ' ',则应读取下一个下一个字符,直到给出非空格字符。

我知道 scanf 会忽略空格,所以不能使用它。我使用 getchar 如何知道读取是否失败?有什么想法吗?

【问题讨论】:

  • 来自 getchar() 文档 - If some other reading error happens, the function also returns EOF, but sets its error indicator (ferror) instead.

标签: c


【解决方案1】:

scanf 在字符读取的情况下不会跳过空格(空白)。要使用scanf 而不读取空格,您可以执行以下操作:

scanf(" %c", ch) // ch is char type  
       ^Notice the space before %c.  

要使用getchar,您必须检查空格

int ch;
while((ch = getchar) != EOF)   // This will also check the reading failed by getchar.
{
    if(ch == ' ')
        continue;
    ...
}    

【讨论】:

    【解决方案2】:

    如果您需要忽略' ''\t'\n' 等空格,请按照@hacks 的建议在scanf() 中使用" %c",并使用来自scanf() 的返回值确定成功。

    int Read1_NotWhiteSpace(char *ch) {
      int retval = scanf(" %c", ch);
      if (retval == 1) return 1;
      return 0; // fail
    }
    

    如果您只需要忽略' '(空格),请使用int getchar(void)

    int Read1_NotSpace(char *ch) {
      int c;
      while ((c = getchar()) == ' ');
      if (c == EOF) return 0; // fail
      *ch = (char) c;
      return 1;
    }
    

    注意:OP 不清楚如何成功返回。成功时可以返回ch,但随后无法区分'\0' 的罕见读取。下面的简单返回 ch 成功。

    int Read1_NotSpaceAlternate(void) {
      int c;
      while ((c = getchar()) == ' ');
      if (c == EOF) return 0; // fail
      return c;
    }
    

    【讨论】:

      【解决方案3】:

      如果getchar 失败,则返回EOF,通常为-1。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 2020-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-27
        • 1970-01-01
        相关资源
        最近更新 更多