一、字符串转整数
1.atoi -- 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)
声明:int atoi(const char *str)
如:
int val;
char str[20];
strcpy(str, "98993489");
val = atoi(str);
2.sscanf -- 从字符串格式化读取数据
声明:int sscanf(const char *buffer, const char *format [, argument ] ...);
参数说明:
buffer – 待格式化的字符串;
format – 根据参数format字符串来转换并格式化数据。
如:
int res;
sscanf(str, "%d", &res);
又如:
const char* buffer = "192.168.0.1/13/hello world";
int ip[4];
char ch;
char str[32];
// 读取IP地址,char型字符,字符串
sscanf(buffer, "%d.%d.%d.%d/%c%s", &ip[0], &ip[1], &ip[2], &ip[3], &ch, str);
printf("ip = %d.%d.%d.%d, c = %c, str = %s\n", ip[0], ip[1], ip[2], ip[3], ch, str);
// 输出结果为:ip = 192.168.0.1, c = 1, str = 3/hello
// 解释:
// 当字符串为某种格式时,可以快速进行字符类型转换,如ip地址字符串"192.168.0.1",可以使用“%d.%d.%d.%d”进行快速获取;
// %s,会读取连续字符,直到遇到一个分隔符(分隔符可以是空白、换行和制表符)结束。"hello"和"world"之间有空格,所以上面执行后读入"3/hello"后截止。
// 注意,如"abc.html|success",使用"%s|%s"无法分开格式化读入数据
3.strtol -- 字符串转换成long型。
根据最新规范,避免使用atoi、atol函数。
声明:long int strtol(const char *str, char **endptr, int base)
如:
char *s = "1235456";
char *tmp;
printf("num-%ld\n", strtol(s, &tmp, 10));
4.strtoll // 字符串转换成long long型。
根据最新规范,避免使用atoll函数。
声明:longd long int strtoll(const char *str, char **endptr, int base)
二、整数转字符串
1.sprintf -- 发送格式化输出到 str 所指向的字符串
声明:int sprintf(char *str, const char *format, ...)
如:
int num = 123456;
char str[80] = {0};
sprintf(str, "%d", num);
sprintf(str, "%f", num); // 如果num是浮点数,如
sprintf(str, "Pi 的值 = %f", M_PI); //Pi 的值 = 3.141593
sprintf(str,"%s","HelloWorld\n"); //"HelloWorld\n"写入a指向的地址
三、memset
声明:void *memset(void * dest, int ch, size_t count)
作用:将ch值(在转换为无符号字符后,就像通过(unsigned char)ch)复制到dest指向的对象的前count个字符。
memset一般用来给申请的数组空间清零使用。
对于int类型的数组只能将其初始化为0 或 -1;
对于char类型的数组可以将其初始化为任意一个单字符。
对应的安全函数是:
errno_t memset_s(void * dest, rsize_t destsz, int ch, rsize_t count)
四、memcpy
声明:void *memcpy(void *str1, const void *str2, size_t n)
作用:从存储区 str2 复制 n 个字节到存储区 str1,内存拷贝。
如:
const char src[50] = "http://www.runoob.com";
char dest[50];
memcpy(dest, src, strlen(src) + 1);
对应的安全函数是:
errno_t memcpy_s(void *restrict dest, rsize_t destsz, const void *restrict src, rsize_t count);
// dest 是目标地址,destsz是目标地址的字符个数(可使用sizeof获取),src是源地址,count是需要拷贝的源字符个数(可使用sizeof获取)
五、strcat
声明:char *strcat(char *dest, const char *src) // 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾
作用:字符串连接
对应的安全函数是:
errno_t strcat_s(char *strDest, size_t destMax, const char *strSrc);
六、strtok
声明:char *strtok(char *str, const char *delim)
作用:字符串分割,分解字符串 str 为一组字符串,delim 为分隔符,该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。
注意,使用该函数进行字符串分割时,会破坏被分解字符串的完整,调用前和调用后的str已经不一样了。
如:
char str[80] = "This is - www.runoob.com - website";
const char delim[2] = "-";
char *token = NULL;
/* 获取第一个子字符串 */
token = strtok(str, delim);
/* 继续获取其他的子字符串 */
while(token != NULL) {
printf("%s\n", token);
token = strtok(NULL, delim);
}
对应的安全函数是:
char *strtok_s(char *str, const char *delim, char **context);
参数说明:
str-待分割的字符串;
delim-分割符字符串;
context-存储剩余的字符串。
注意:由于strtok_s函数会对str参数的字符串进行修改,所以str入参不能为[const char * ],否则会导致程序崩溃。
如:
char str[] = "hello world,my name is congcong.";
char *delim = ",";
char *token = NULL;
char *nextToken = NULL;
token = strtok_s(str, delim, &nextToken); // 相当于“,”是分割符delim
while(token != NULL) {
printf("%s\n", token);
token = strtok_s(NULL, delim, &nextToken);
}
七、strstr
声明:char *strstr(const char *haystack, const char *needle)
作用:找到字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。如果未找到则返回 null。
如:
const char haystack[20] = "RUNOOB";
const char needle[10] = "NOOB";
char *ret;
ret = strstr(haystack, needle); // ret的结果为: NOOB
八、strchr
声明:char *strchr(const char *str, int c)
作用:在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
如:
const char str[] = "http://www.runoob.com";
const char ch = '.';
char *ret;
ret = strchr(str, ch);
printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
// 输出是: |.| 之后的字符串是 - |.runoob.com|
九、strrchr
声明:char *strrchr(const char *str, int c)
作用:在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。
如:
int len;
const char str[] = "https://www.runoob.com";
const char ch = '.';
char *ret;
ret = strrchr(str, ch);
printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
// 输出是: |.| 之后的字符串是 - |.com|
十、strcpy
声明:char *strcpy(char *dest, const char *src)
作用:把 src 所指向的字符串复制到 dest,拷贝字符串,末尾会自动补'\0'。
对应的安全函数是:
errno_t strcpy_s(char *strDest, size_t destMax, const char *strSrc);
十一、strncpy
声明:char *strncpy(char *dest, const char *src, size_t n);
作用:把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。
如:
char src[40];
char dest[12];
memset(dest, '\0', sizeof(dest));
strcpy(src, "This is runoob.com");
strncpy(dest, src, 10);
对应的安全函数是:
errno_t strncpy_s(char *strDest, size_t destMax, const char *strSrc, size_t count);
十二、strcmp
声明:strcmp(const char *s1,const char * s2)
作用:把 str1 所指向的字符串和 str2 所指向的字符串进行比较
// 如果返回值小于 0,则表示 str1 小于 str2。
// 如果返回值大于 0,则表示 str1 大于 str2。
// 如果返回值等于 0,则表示 str1 等于 str2。
//特别注意:strcmp(const char *s1,const char * s2) 这里面只能比较字符串,即可用于比较两个字符串常量,或比较字符数组,不能比较数字等其他形式的参数。
十三、strncmp
声明:int strncmp(const char *str1, const char *str2, size_t n)
作用:把 str1 和 str2 进行比较,最多比较前 n 个字节
// 如果返回值 < 0,则表示 str1 小于 str2。
// 如果返回值 > 0,则表示 str1 大于 str2。
// 如果返回值 = 0,则表示 str1 等于 str2。
十四、memcmp
声明:int memcmp(const void *str1, const void *str2, size_t n)
作用:把存储区 str1 和存储区 str2 的前 n 个字节进行比较, str1 str2-- 指向内存块的指针,n -- 要被比较的字节数。
// 如果返回值小于0,则表示 str1 小于 str2。
// 如果返回值大于0,则表示 str1 大于 str2。
// 如果返回值等于0,则表示 str1 等于 str2。
// 注意:这个接口不光可以用来判断两个字符串,还可以判断两个整数的数组的内容是否相等,而不必使用for循环逐个遍历了。力扣567题(字符串的排列)可以考虑使用这个接口解题。
十五、memchr
声明:void *memchr(const void *str, int c, size_t n)
作用:在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。
参数说明:
str -- 指向要执行搜索的内存块。
c -- 以 int 形式传递的值,但是函数在每次字节搜索时是使用该值的无符号字符形式。
n -- 要被分析的字节数。
如:
const char str[] = "http://www.runoob.com";
const char ch = '.';
char *ret;
ret = (char*)memchr(str, ch, strlen(str));
printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
// 输出:|.| 之后的字符串是 - |.runoob.com|
yo peace!
网友评论