【问题标题】:Detecting an empty line in C检测C中的空行
【发布时间】:2015-05-07 20:25:45
【问题描述】:

我正在尝试将输入逐行保存在字符串中。我需要能够检测到空行或仅包含空格的行,并在发生时打印“忽略”。我怎么做? strlen(str) == 0 似乎不起作用。

int getLine(char str[]) {
  int i = 0;
  int c;
  while (i < N - 1 && (c = getchar()) != EOF && c != '\n') {
    str[i] = c;
    ++i;
  }
  if (c == EOF) return 0;
  str[i] = '\0';
  return 1;
}

【问题讨论】:

  • 看看this question,可能对你有帮助。
  • 你是如何定义空白的? SPACE 是空格吗? TAB呢?贝尔? ESC键?请注意您对空格的定义,查看asciitable.com 以更好地理解我的意思。

标签: c string parsing


【解决方案1】:

仅包含空格的行不为空。它充满了空间。

有很多方法可以做到这一点。希望这很清楚。

// Returns nonzero iff line is a string containing only whitespace (or is empty)
int isBlank (char const * line)
{
  char * ch;
  is_blank = -1;

  // Iterate through each character.
  for (ch = line; *ch != '\0'; ++ch)
  {
    if (!isspace(*ch))
    {
      // Found a non-whitespace character.
      is_blank = 0;
      break;
    }
  }

  return is_blank;
}

【讨论】:

    【解决方案2】:

    新功能:

    int getNonBlankLine(char str[])
    {
        int nb = 0;
        while (nb == 0)
        {
            int i = 0;
            int c;
            while (i < N - 1 && (c = getchar()) != EOF && c != '\n')
            {
                str[i++] = c;
                if (!isblank(c))
                  nb++;
            }
        }
        if (c == EOF)
            return 0;
        str[i] = '\0';
        return i;
    }
    

    这将返回行的长度;它从返回的数据中排除换行符;它跳过所有空行;它不会溢出它的缓冲区;它无法让您检测到该行并未全部放入缓冲区。

    如果您不想使用新函数或在上面的函数中添加代码来代替旧的函数体,那么您必须在读取后分析该行并再次调用输入。其他答案会为您提供可用于此目的的代码。

    您还可以在识别空格和制表符的isblank() 和识别空格、制表符、换行符、换页符、回车符和垂直制表符的isspace() 之间进行选择 (" \t\n\f\r\v")。

    【讨论】:

      【解决方案3】:

      strlen 将检测空行,但不会检测完全由空格组成的行。你可以自己写这个函数:

      int all_space(const char *str) {
          while (*str) {
              if (!isspace(*str++)) {
                  return 0;
              }
          }
          return 1;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多