文章目录
- 前言
- 字符串复制-strcpy
- 字符串复制(按照位数)-strncpy
- 字符串比较-strcmp
- 字符串比较(按照位数)-strncmp
- 不区分大小写的字符串比较-strcasecmp
- 不区分大小写的比较(前n位)-strncasecmp
- 字符串按照格式写入-sprintf
- 字符串按照格式和个数写入-snprintf
- 字符串拼接-strcat
- 字符串拼接(前n位)-strncat
- 字符串切割-strtok
- 字符串切割-strsep
- 查找字符串是否在另一个字符串中-strstr
- 查找字符串是否在另一个字符串中-不区分大小写-strcasestr
- 查找某个字符是否在字符串中-strchr
- 字符串转数字-atoi
- 在字符串提取前面的数字字符并转换成数字(根据参数选择转换后的数字类型)-strtoul
- 判断字符是否为空-isspace
- 检查字符是否是十进制数字字符-isdigit
前言
当前文档为C语言字符串的基本操作(用过的以及man时发现的),用于本人记录使用,会持续更新
字符串复制-strcpy
#include <string.h>
char *strcpy(char *dest, const char *src);
// 将后面的变量赋值给前面
// 函数返回一个指向目标字符串dest的指针。
// 需要注意前面变量的长度,要大于等于 后面的长度,要不然编译报警告,还容易越界后报错
字符串复制(按照位数)-strncpy
#include <string.h>
char *strncpy(char *dest, const char *src, size_t n);
// 将后面的字符串赋值给前面的字符串 复制 n 个
// 函数返回一个指向目标字符串dest的指针。
字符串比较-strcmp
#include <string.h>
int strcmp(const char *s1, const char *s2);
// 字符串比较,完整比较
// 比较方式为 按照字符串每个字符的ASCII码按位比较,不相同时,前面的大 返回 大的数,后面的大,返回负的少的个数
字符串比较(按照位数)-strncmp
#include <string.h>
int strncmp(const char *s1, const char *s2, size_t n);
// 前后字符串比较,比较前n位,比较方式同上
不区分大小写的字符串比较-strcasecmp
#include <strings.h>
int strcasecmp(const char *s1, const char *s2);
// 不区分大小写的比较,比较方式同上
不区分大小写的比较(前n位)-strncasecmp
#include <strings.h>
int strncasecmp(const char *s1, const char *s2, size_t n);
// 不区分大小写的比较,比较前n位,比较方式同上
字符串按照格式写入-sprintf
#include <stdio.h>
int sprintf(char *str, const char *format, ...);
// 按照 中间的格式,将后面的变量 写入到 前面的字符串中
char buf[128] = {0};
if(sprintf(buf,"%s: %d\n","name",18) > 0){
//成功 返回 写入的字符数
}else{
//失败返回 负数
}
字符串按照格式和个数写入-snprintf
#include <stdio.h>
int snprintf(char *str, size_t size, const char *format, ...);
// 按照中间格式,将后面的变量们,写入到第一个变量中,写入 size个
// 注意: size为最大限制个数,实际写入最大个数为 size - 1 个,最后一位会被 写入 '\0'
char buf[128] = {0};
if(snprintf(buf,32,"%s: %d\n","name",18) > 0){ //按照 %s: %d 格式将 name 跟 18 写入到 buf中,最多写入 32个
//成功 返回 写入的字符数
}else{
//失败返回 负数
}
字符串拼接-strcat
#include <string.h>
char *strcat(char *dest, const char *src);
// 将src字符串 拼接到 dest 字符串中,替换dest的'\0'。需要注意dest字符串足够大。
字符串拼接(前n位)-strncat
#include <string.h>
char *strncat(char *dest, const char *src, size_t n);
// 将src字符串中的前n位 拼接到 dest 字符串中,替换dest的'\0'。需要注意dest字符串足够大。
字符串切割-strtok
#include <string.h>
char *strtok(char *str, const char *delim);
// 字符串切割,将str 按照 delim 样式切割。将切割完的字符串的指针返回
// 第二次切割时,str 写为 NULL
int main(int argc, char const *argv[])
{
char buf[128] = "this_is_test:name:qxy:age:200";
char *temp = NULL;
temp = strtok(buf,":");
while(temp != NULL){
printf("__<%s>\n",temp);
temp = strtok(NULL,":");
}
return 0;
}
字符串切割-strsep
#include <string.h>
char *strsep(char **stringp, const char *delim);
// 字符串切割:将stringp 字符串 按照 字符 delim 进行切割
// 切割完 前面的部分 通过返回值返回,剩余部分 保存在 stringp 字符串中
int main()
{
char query[] ="this_is_test:name:qxy:age:200";
char *q, *temp_q;
q = query;
printf("old_str is <%s>\n",query);
temp_q = strsep(&q,":");
printf("[temp_q ] :<%s>\n", temp_q); //但是
printf("[q] :<%s>\n", q);
temp_q = strsep(&q,":");
printf("[2temp_q ] :<%s>\n", temp_q);
printf("[2q] :<%s>\n", q);
temp_q = strsep(&q,":");
printf("[3temp_q ] :<%s>\n", temp_q);
printf("[3q] :<%s>\n", q);
return 0;
}
查找字符串是否在另一个字符串中-strstr
#include <string.h>
char *strstr(const char *haystack, const char *needle);
// 字符串查找,查找后面的字符串 是否在 前面的字符串中
// 没找到返回 NULL
// 找到,返回查找字符串的在haystack字符串的第一位指针
查找字符串是否在另一个字符串中-不区分大小写-strcasestr
#include <string.h>
char *strcasestr(const char *haystack, const char *needle);
// 查找后面字符串 是否在 前面字符串中,不区分大小的的查找
// 没找到返回 NULL
// 找到,返回查找字符串的在haystack字符串的第一位指针
查找某个字符是否在字符串中-strchr
#include <string.h>
char *strchr(const char *s, int c);
// 函数返回一个指针,指向前面字符串中 最后一次出现的字符c 的位置
// 没找到返回 NULL
字符串转数字-atoi
#include <stdlib.h>
int ret = atoi(const char* buf);
// 出错返回 0
在字符串提取前面的数字字符并转换成数字(根据参数选择转换后的数字类型)-strtoul
#include <stdlib.h>
int main(int argc, char const *argv[])
{
char buf[128] = " 25036 HELLO_WORLD QXY";
//char buf[128] = " HELLO_WORLD QXY 2525252"; //这个不行.....
printf("buf is <%s>\n",buf);
char *temp = NULL;
unsigned long int x = strtoul(buf,&temp,10);
printf("x = <%lu>\n",x);
printf("temp = <%s>\n",temp);
printf("buf = <%s>\n",buf);
return 0;
}
unsigned long strtoul(const char nptr, char **endptr, int base);
strtoul()函数根据给定的基数将nptr中字符串的初始部分转换为无符号长值,该值必须为介于2和36之间(包括2和36)或者是特殊值0。
基本上就是 0 2 8 10 16 (如果是 0 字符串以0x开头就是16进制读取,以0开头 就是8进制,否则一律按十进制处理)
给定基数中的数字。(在10以上的base中,大写或小写字母“A”表示10,“B”表示11,依此类推 “Z”表示35。)
字符串可以以任意数量的空格 tab 开头,后跟一个可选的“+”或“-”号。
字符串的剩余部分以显而易见的方式转换为无符号长值,在第一个无效字符处停止
如果endptr不为NULL,strtoul()将第一个无效字符的地址存储在endptr中。如果根本没有数字,strtoul()将存储endptr中nptr的原始值(并返回0)。特别是,如果返回时nptr不是“\0”,但**endptr是“\0”时,则整个字符串为有效的
strtoull()函数的工作原理与strtoul()函数类似,但返回一个无符号长-长值。
判断字符是否为空-isspace
’ ’ (0x20) space (SPC) 空格符
‘\t’ (0x09) horizontal tab (TAB) 水平制表符
‘\n’ (0x0a) newline (LF) 换行符
‘\v’ (0x0b) vertical tab (VT) 垂直制表符
‘\f’ (0x0c) feed (FF) 换页符
‘\r’ (0x0d) carriage return (CR) 回车符
#inlcude <ctype.h>
int ret = isspace(char c);
//为空返回非0,不为空返回 0
检查字符是否是十进制数字字符-isdigit
#inlcude <ctype.h>
int ret = isdigit(char c);
//是一个数字,则该函数返回非零值,否则返回 0。