2013-10-22 19 views
0

我有一堆字符串,我需要验证,如果这些都有空格。如何确保字符串在给定长度内充满空间?

我可以做strlen(trim(strct.data)) > 0

但是,它不空值终止,但长度已知

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

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

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

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

+1

如果'data'不是'NUL'终止,'trim()'如何知道何时停止? – jxh

+0

是否有*理由*您没有使用NULL终止的字符串?没有这一点,你需要自定义代码来处理任何“字符串”操作,并传递整个结构或“字符串”和长度。 – crashmstr

+0

难道你不能修改修剪以返回删除的空格数量吗?无论如何,修剪必须走字符串。 – Henno

回答

1

如何确保该字符串是充满空间对于一个给定长度是多少?

步骤1:

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

步骤2:

现在使用strncmp()比较strct.data字符阵列的字符的数目strct.len与buf

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

您无需重复step1。


另一种解决方案JXH建议你也可以使用memset()代替sprintf()

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

您需要此一次,下一次起你不必这样做。


您也可以使用VLA。

申报char buf[strct.len];

但是您需要每次使用memset。

+1

你可以在缓冲区使用'memset()',并且你可以使用VLA做'char buf [strct.len]',并使用'memcmp()'。 – jxh

+0

是的好点。 – Gangadhar

1

也许最好是做自己的循环:

for(int i=0; i<strct.len; ++i) { 
    if(strct[i] != ' ') { 
    return false; 
    } 
} 
return true; 
+0

正如我所说,如果没有其他更好的方法,我会选择它 – San

+1

无论如何,你的装饰必须迭代字符串,可能你已经有了你需要的数字 – Henno

+0

如果一个新的func使用'strct.len'来处理修剪,你应该已经知道它已经有了编号 – San

1

由于字符数组不为空终止,它不是一个
但是让我们不要在这一点上狡猾,并为大型数组做一个快速例程。

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); 
} 
相关问题