字符串在C语言中以\0结束,字符串相关的函数定义在<string.h>中,都是以str开头的函数,操作的字符串必须有结束符。
strlen字符串长度
strcpy复制一个字符串到另一个字符串
strcmp比较两个字符串
stricmp比较两个字符串,不区别大小写
strchr在字符串中查找一个字符,如果有在返回第一个出现为止的指针
strstr查找子字符串
strcat将一个字符串附加到另一个字符串后面。
不过有时候为了操作没有结束符的字符串,也是用操作内存的函数来处理字符串:
memset设置一段内存中所有字节为某个值,常用语初始化结构体。
memcpy复制一段内存到另一个短内存
memcmp比较两个端内存
- 字符串的定义不需要写长度,编译器会自动计算,例如:
char rn2[5] = "\r\n\r\n";
应写成
char rn2[] = "\r\n\r\n"; - 字符串复制不需要一个字符一个字符的复制,可以使用strcpy或者memcpy,前者用于复制‘\0’结尾的字符串,后者可以复制特定长度的内存块,例如:
char a[] = "abc";
char c[16];
char d[16];
strcpy(c, a): // 这时c中前四个字节为abc\0,其他字节未赋值,因此不确定
memcpy(d, a, 2): // 这时d中前2个字节为ab,其他字节未赋值,因此不确定 - 对于结构体,可以通过memset来将其中所有字节都赋成0
Request r;
memset(&r, 0, sizeof(Request));
或者
memset(&r, 0, sizeof(r)); - 采用strchr查找字符串中的字符位置,例如:
char *a = "abc";
char *b = strchr(a, 'b');
则b就指向字符串中'b'的位置,也就是说b-a等于1 - 同样,用strstr查找字符串中子字符串的位置,例如:
char *a = "abcccab";
char *b = strstr(a, "cc");
则b-a等于2,查找子字符串第一个出现的地方。
作业
解析下面HTTP请求的各个部分,将值填入结构体:
char request[] = "POST /Login.aspx HTTP/1.1\r\nHost: test.baidu.com\r\nContent-Length: 39\r\n\r\nusername=cs&password=123456&login=login";
#define MAX_PARAMS_COUNT 8
struct Params {
char Name[20]; // 参数名字
char Value[30]; // 参数值
};
struct Request {
char Method[10]; // 请求 方法,对上述字符串应为:POST
char Path[512]; // 请求路径,应为:/Login.aspx
char Host [64]; // 服务器,应为:test.baidu.com
int ContentLength; // 39
int ParamCount; // 3
struct Params Param[MAX_PARAMS_COUNT];
};