项目开发常见字符串处理模型-两头堵模型
https://blog.csdn.net/flying_wild_fox/article/details/50155067
strlen函数 :从内存的某个位置开始开始扫描,直到碰到第一个字符串结束符‘0’为止,然后返回计数器值,返回的长度不包含'\0'
isspace函数 :若参数为空白字符,则返回TRUE,否则返回NULL。 空白字符包含哪些见文章末尾
PS: 如果不知道c语言提供的库函数存放在哪个头文件,可以下载c语言函数大全查一下
需求:编写一个函数,要求去除字符串的前后空格
下面用二种方法实现:
1 创建一个字符型数组,用数组去接收去除空格后的字符串。
2 直接修改原字符串,把空格删除 (这样做的前提是char* 指针所指向的内存空间必须可以被修改才行)。
1 创建一个字符型数组,用数组去接收去除空格后的字符串:
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
int trimSpace(char*str, char*newstr)
{
char* p = str; //不要直接修改形参指针,用一个临时变量去接收它的值,修改临时变量
int count = 0;
if (str == NULL || newstr == NULL)
{
return 0;
}
int i = 0;
int j = strlen(p) - 1;
while (isspace(p[i]) && p[i] != '\0')//是空白符就往后走,直到找到第一个不是空白字符的字符
{
i++;
} while (isspace(p[j]) && p[j] != '\0')//是空白符就往前走,直到找到第一个不是空白字符的字符 { j--; }
count = j - i + 1;//计算去除二边空白字符后的长度
strncpy(newstr, str + i, count);//从str的第i个开始,拷贝count个字符到newstr
newstr[count] = '\0';//别忘了在newstr后面加字符串结束符 '\0'
return 1;
}
int main(void)
{
char *p = " abcd "; //字符串的首尾都有空格
char arrstr[128]; //足以包含去除空格后的字符串就可以
trimSpace(p, arrstr);
printf("字符串: %s \n", arrstr);
system("pause");
return;
}
2 直接修改原字符串,把空格删除 (这样做的前提是char* 指针所指向的内存空间必须可以被修改才行):
int trimSpace(char*str)
{
char* p = str; //不要直接修改形参指针,用一个临时变量去接收它的值,修改临时变量
int count = 0;
if (str == NULL)
{ return 0; }
int i = 0;
int j = strlen(p) - 1;
while (isspace(p[i]) && p[i] != '\0')//是空白符就往后走,直到找到第一个不是空白字符的字符
{
i++;
}
while (isspace(p[j]) && p[j] != '\0')//是空白符就往前走,直到找到第一个不是空白字符的字符
{
j--;
}
count = j - i + 1;//计算去除二边空白字符后的长度
strncpy(str, str + i, count);//直接修改str, 从str的第i个开始,拷贝count个字符到str
str[count] = '\0';//别忘了在newstr后面加字符串结束符 '\0'
return 1;
}
这个函数直接修改str,所以必须保证传入的字符串str指向的内存空间是可写的
通过内存四区知道:char *p = " abcd ";这样字符串会存在常量区,是不可修改的
char buf[128]; 这样字符串buf存在栈区,可以修改,所以在调用trimSpace时可以用char数组调用:
int main(void)
{
char buf[] = " abcd "; //字符串的首尾都有空格
trimSpace(buf);
printf("字符串: %s \n", buf);
system("pause");
return;
}
空白字符包含:
' ' 空格
'\t' 水平制表符
'\n‘ 换行符
'\v' 垂直制表符
'\f' 换页符
'\r' 回车符