string_strspn&strcspn
size_t
strspn
(
const
char
*s,
const
char
* accept);
strspn返回s中第一个不在accept中出现过的字符下标。
Returns an integer value specifying the length of the substring in str that consists entirely of characters in strCharSet.
If str begins with a character not in strCharSet, the function returns 0.
accept可以包含多个字符,从str开始搜索,计算str中包含的accept中任一字符的下标。
#include <string.h> #include <stdio.h> main() { char *str="Linux was first developed for 386/486-based pcs."; printf("%d\n",strspn(str,"Linux")); printf("%d\n",strspn(str,"/-")); printf("%d\n",strspn(str,"1234567890")); }
运行结果:
5
0
0
size_t strcspn(const char *s, const char * reject);
strcspn()从参数s 字符串的开头计算连续的字符, 而这些字符都完全不在参数reject 所指的字符串中.
简单地说, 若strcspn()返回的数值为n, 则代表字符串s 开头连续有n 个字符都不含字符串reject 内的字符.
返回字符串s 开头连续不含字符串reject 内的字符数目,也即返回s中第一个在reject中出现过的字符下标。
#include <string.h> main(void) { char *str = "Linux was first developed for 386/486-based pcs. "; printf("%d\n", strcspn(str, " ")); printf("%d\n", strcspn(str, "/-")); printf("%d\n", strcspn(str, "1234567890")); }
运行结果:
5
33
30
编程使用:key-value去掉参数前面的空格
int _nvram_init(void *unused) { FILE *in; char buffer[SIZE], *token, *line; int i; if (!(in = fopen(PATH_DEV_NVRAM, "r"))) { printf("nvram file can not open\n"); return -1; }
while (fgets(buffer, 300, in)) {
if (strchr(buffer, '\n')) *(strchr(buffer, '\n')) = '\0';
token = buffer + strspn(buffer, " ");
if (*token == '\0') continue;
line = token + strcspn(token, "=");
if (*line == '\0') continue;
*line = '\0';
line++;
/* eat leading whitespace */
line = line + strspn(line, " ");
/* eat trailing whitespace */
for (i = strlen(line); i > 0 && (line[i - 1]==' '); i--);
line[i] = '\0';
_nvram_set(token,line);
}
fclose(in);
printf("nvram init----\n");
return 0;
}