C
- 1. strstr
- 2. gets
- 3. strlen
- 4. \r\n
- 5. const char * 与 char const *
- 6. size_t、ssize_t、unsigned char、uint8_t
- 6.1 size_t、ssize_t
- 6.2 unsigned char
- 6.3 uint8_t / uint16_t / uint32_t / uint64_t
- 7. memcpy
1. strstr
在字符串 haystack 中查找第一次出现字符串 needle 的位置, 没有返回NULL.
char *strstr(const char *haystack, const char *needle)
- haystack – 要被检索的 C 字符串。
- needle – 在 haystack 字符串内要搜索的小字符串。
2. gets
获取一个可以含空格的字符串. 成功返回str, 错误或为空则返回 NULL。
char *gets(char *str)
- str – 这是指向一个字符数组的指针,该数组存储了 C 字符串。
代码:
#include <stdio.h>
#include <string.h>
int main()
{printf("输入字符串:\n");char str1[100];gets(str1);char str2[100];printf("输入子串:\n");gets(str2);if (strstr(str1, str2) != NULL){printf(" %s 是 %s 子串\n", str2, str1);}else{printf(" %s 不是 %s 子串\n", str2, str1);}return 0;
}
运行结果:
3. strlen
size_t strlen(const char *str)
- str – 要计算长度的字符串。
代码:
#include <stdio.h>
#include <string.h>int main()
{printf("输入字符串:\n");char str1[100];gets(str1);int len = strlen(str1);if (len > 0) // 不空{printf("str1长度:%d\n", len);printf("str1 -> %s\n", str1);}else // 不空{puts("输入字符串为空.");}return 0;
}
运行结果:
4. \r\n
在Windows中:
‘\r’ 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖;
‘\n’ 换行,换到当前位置的下一行,而不会回到行首;
5. const char * 与 char const *
C++标准规定,const关键字放在类型或变量名之前等价的。
so
const char* 等价于 char const*
6. size_t、ssize_t、unsigned char、uint8_t
6.1 size_t、ssize_t
size_t 类型表示C中任何对象所能达到的最大长度,它是无符号整数。
-
size_t在32位架构中定义为:typedef unsigned int size_t;
-
size_t在64位架构中被定义为:typedef unsigned long size_t;
-
size_t是无符号的,并且是平台无关的,表示0-MAXINT的范围;int为是有符号的;
ssize_t是有符号整型(signed size_t),在32位机器上等同与int,在64位机器上等同与 long int.
- %d输出int型;%zu输出size_t型。size_t在库中定义为unsigned int。(一个是整型,一个是无符号整型。)
unsigned (%u)表示无符号。 电脑是二进制存储,无符号就是没有正负号,所以存储的数据是没有符号位的。
补充:如果%zu不能使用,可以用%u取代。%zu不能输出负数。
#include <stdio.h>
#include <string.h>int main()
{int num = 5;size_t len = sizeof(num);printf("size_t len = %zu\n", len);printf("size_t len = %u\n", len);return 0;
}
6.2 unsigned char
char 和 short / int / long 都是整型. unsigned char和char 都是一个字节长度(8bit), 它们唯一的不同就是unsigned char 没有最高位的符号位.
6.3 uint8_t / uint16_t / uint32_t / uint64_t
这都是使用typedef给类型起得别名。
1字节 uint8_t
2字节 uint16_t
4字节 uint32_t
8字节 uint64_t
7. memcpy
void *memcpy(void *str1, const void *str2, size_t n)
- str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
- str2 – 指向要复制的数据源,类型强制转换为 void* 指针。
- n – 要被复制的字节数。
#include <stdio.h>
#include <string.h>int main()
{char *str = "0123456789";char str2[20];memcpy(str2, str, strlen(str) + 1);printf("str2 -> %s\r\n", str2);return 0;
}