写在前面:本文主要用来积累字符串处理的各种方式。
正文:
1、目的:函数输入一个字符串,要求去掉字符串中的行首和行尾的空格后输出。
实现函数和测试代码如下:
#include <stdio.h>
#include <string.h>
//该函数的作用为:输入一个字符串,删掉行首和行尾的空格
void strtrim (char * p_str )
{
char *p = p_str;
char *q = p_str;
if(NULL == p_str)
return;
//去掉行首的空格
while((*p == ' ')||(*p == '\t'))
{
p++;
}
//赋值
while((p != NULL )&&(*p != '\0'))
{
*q++ = *p++;
//*q = *p;
//q ++;
//p ++;
}
q --;
while((*q == ' ')||(*q == '\t'))
{
q --;
}
//加上结尾
*(q + 1) = '\0';
}
int main(void)
{
char buf[20] = {" abcd efg "}; // 前边两个空格,中间2个空格,后边一个空格
printf("before convert buf:%s\n",buf);
printf("before convert strlen(buf)=%d\n",strlen(buf));
strtrim(buf);
printf("after convert buf:%s\n",buf);
printf("after conver strlen(buf)=%d\n",strlen(buf));
}
测试结果:
2、目的:将一串字符串,用特定的分隔符分成多段字符串,例如一串字符串为:"1232456.789.10.112.34",然后以". "为分隔符将字符串分成5段分别是"123456"、"789"、"10"、"112"、"34"
strtok()函数:在 #include <string.h>头文件中,
函数原型:char *strtok(char *str, const char *delim);
当strtok()在参数str的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。
返回值:从str开头开始的一个个被分割的串。当str中的字符查找到末尾时,返回NULL。如果查找不到delim中的字符时,返回当前strtok的字符串的指针。所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。
注意:需要注意的是,使用该函数进行字符串分割时,会破坏被分解字符串的完整,调用前和调用后的s已经不一样了。第一次分割之后,原字符串str是分割完成之后的第一个字符串,剩余的字符串存储在一个静态变量中,因此多线程同时访问该静态变量时,则会出现错误。
代码:
int split(char dst[][80], char* str, const char* spl)
{
int n = 0;
char *result = NULL;
result = strtok(str, spl); //第一次调用
while( result != NULL )
{
strcpy(dst[n++], result);
result = strtok(NULL, spl); //后面调用
}
return n;
}
int main()
{
char str[] = "1232456.789.10.112.34";
char *p = (char *)malloc(sizeof(str));
memcpy(p,str,sizeof(str)); //保存住源来字符串
int i = 0;
char dst[10][80];
int cnt = split(dst, str, ".");
for ( i = 0; i < cnt; i++)
puts(dst[i]);
printf("1:str:%s\n",str);
//printf("p:%s\n",p);
memcpy(str,p,sizeof(str)); //将字符串还原
printf("2:str:%s\n",str);
free(p);
return 0;
}
运行结果: