在C语言中检测空行

5
我正在尝试一行一行地将输入保存到字符串中。 如果有空行或仅由空格组成的行,我需要能够检测并打印“已忽略”。 我该怎么做? 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;
}

2
看一下这个问题,或许能帮到你。 - mattias
你如何定义空格?SPACE是空格吗?TAB呢?BEL和ESC呢?在定义空格时要小心,可以查看http://www.asciitable.com/以更好地了解我的意思。 - Eugene K
3个回答

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;
}

1
新功能:

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")。


0

strlen 函数可以检测空行,但无法检测只包含空格的行。您可以自己编写此函数:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接