字符串在C语言中以\0结束,字符串相关的函数定义在中,都是以str开头的函数,操作的字符串必须有结束符。

strlen字符串长度

strcpy复制一个字符串到另一个字符串

strcmp比较两个字符串

stricmp比较两个字符串,不区别大小写

strchr在字符串中查找一个字符,如果有在返回第一个出现为止的指针

strstr查找子字符串

strcat将一个字符串附加到另一个字符串后面。

不过有时候为了操作没有结束符的字符串,也是用操作内存的函数来处理字符串:

memset设置一段内存中所有字节为某个值,常用语初始化结构体。

memcpy复制一段内存到另一个短内存

memcmp比较两个端内存

 

  1. 字符串的定义不需要写长度,编译器会自动计算,例如:
    char rn2[5] = "\r\n\r\n";
    应写成
    char rn2[] = "\r\n\r\n";
  2. 字符串复制不需要一个字符一个字符的复制,可以使用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,其他字节未赋值,因此不确定
  3. 对于结构体,可以通过memset来将其中所有字节都赋成0
    Request r;
    memset(&r, 0, sizeof(Request));
    或者
    memset(&r, 0, sizeof(r));
  4. 采用strchr查找字符串中的字符位置,例如:
    char *a = "abc";
    char *b = strchr(a, 'b');
    则b就指向字符串中'b'的位置,也就是说b-a等于1
  5. 同样,用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];
};