0

我有一堆字符串,我需要验证它们是否包含所有空格。

我能做到strlen(trim(strct.data)) > 0

但是,它不是 null 终止的,而是已知长度

即如果strct.len是 5,那么我需要验证是否strct.data有 5 个字符的空格。第 6 个字符不保证为空。我有一个数组,strct每个数组都可以有不同长度的数据来验证空格。

我试过strnlen(trim(strct.data))了,后来意识到它没有解决任何问题,因为修剪已经删除了所有空格。

除了明显循环每个字符strct.data(如果没有其他选择,我的最后一个选择)之外的任何想法?

注意:trim 是一个用户定义的函数,我用来删除前导和尾随空格。它也不会停止,直到 NULL 。我正在寻找一种方法来处理两者。

4

3 回答 3

1

可能最好的方法是自己循环:

for(int i=0; i<strct.len; ++i) {
  if(strct[i] != ' ') {
    return false;
  }
}
return true;
于 2013-10-22T16:27:09.577 回答
1

如何确保字符串在给定长度下充满空格?

步骤1:

  char buf[MAX_SIZE];
  sprintf(buf,"%*s",MAX_SIZE-1,"");  //fill buffer with spaces

第2步:

现在使用strncmp()比较 strct.len strct.data字符数组的字符数buf

if(strncmp(strct.data ,buf ,strct.len) ==0)
  {
   //all are spaces
  }  

您无需重复步骤 1。


另一个解决方案 jxh 建议您也可以使用memset()而不是sprintf()

  memset(buf, ' ', sizeof buf); //fill buf with all spaces 

你需要这样做一次,下次你不需要这样做。


您也可以使用 VLA。

声明char buf[strct.len]

但你每次都需要使用 memset。

于 2013-10-22T16:54:37.463 回答
1

由于字符数组不是以 null 结尾的,因此它不是string
但是,让我们不要在这一点上争论不休,为大型数组制定一个快速的例程。

IsCharArrayAllSpace(const char *p, size_t Length) {
  if (Length < 1) return 1;  // TBD: decide how to handle the zero-length case
  return (p[0] == ' ') && (memcmp(p, &p[1], Length-1) == 0);
}
于 2013-10-22T16:46:55.777 回答