<01>操作用到的特殊函数:
格式: strcmp(字符数组名1,字符数组名2)
功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。
字符串1=字符串2,返回值=0;
字符串1〉字符串2,返回值〉0;
字符串1〈字符串2,返回值〈0。
本函数也可用于比较两个字符串常量,或比较数组和字符串常量。
ANSI标准规定,返回值有正数,负数,0.而确切数值是依赖不同的C实现的。
<02> strncpy函数指定位数实现拷贝
字符串拷贝:这次用到这个是我要取出一个字符串的前三个字符,所以我觉得这个函数更好用
int main(void)
{
char a[] = "abcdef";
char b[20] = { 0 };
strncpy(b, a, 2);
printf("%s\n", b);//ab
return 0;
}
<03>判断一个字符串是否是英文还是中文
1.判断字符串中每个ASCII的值,如果是小于0的就是中文字符,反之就是英文
2.只要判断"第一个字节"是否>0x7f,如果大于则是汉字,否则是英文。对UNICODE码(Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。
Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文
本转换、处理的要求。),则是看第一个字节是否为0.
week_day[10]="fafdafdadf";
if (week_day[0] >0x7f)
{
strncpy(dest_week, week_day, 9);
}else{
strncpy(dest_week, week_day, 3);
}
<04>sprintf将两个数组里面的字符串进行拼接到另一个数组中去
str_date[10]= "ab";
str_time[10]="cd";
str_total[20]=NULL;
sprintf(str_total, "%s %s", str_date, str_time);
str_total[20]="ab cd";
<05> Linux命令: cat >和cat >>
01、‘>’ 代表 输出的内容重定向到文件。使用> 重定向后 文件 中原本的内容会被覆盖
02、">>" 代表 将输出的内容已追加的方式重定向到文件,使用>> 重定向后 文件 中原本的内容不会被覆盖,而是在原有的内容后面 追加 新的内容
<06>(指定格式输出)snprintf用法:
int snprintf(char *str, size_t size, const char *format, ...);
str:指向要写入结果的字符数组(缓冲区)的指针。
size:要写入的最大字符数,包括最后的 null 终止符。
format:格式化字符串,它可以包含类似于 printf 函数中的占位符,用于插入不同类型的值。
snprintf 的工作方式类似于 printf,但是不会将结果输出到标准输出,而是将结果写入到提供的字符数组中。
它会根据指定的格式字符串和可变数量的参数生成一个格式化的字符串,并将其复制到指定的缓冲区中,直到达到指定的最大字符数或格式化操作完成为止。
返回值:format的大小,不是复制内容的大小。所以可以通过返回值来判断buffer(第一参数)是否接收了整个format,如果返回值小于0,snprintf出错了;
如果返回值大于等于size,说明想要拷贝的内容大小(也就是:返回值=sizeof(format) - 1)大于了定义的要buffer容纳的字符长度(size - 1),一般来说,size的大小小于等于(sizeof(buffer) )eg:
#include <stdio.h>
int main()
{
int a = 1;
char buf[32] = "Nike";
char buf1[32] = {0};
snprintf(buf1, sizeof(buf1)-1, "hello, I am %s. [%d]", buf, a);
printf("%s\n", buf1);
return 0;
}
结果:hello, I am Nike. [1]
<07>atoi的具体用法:
atoi(s)函数用于把字符串转换成整数,转换后的值不能超出int的表示范围。
这个函数会尽可能多的在开头丢弃空格字符,直到遇到第一个非空格的字符,从这个字符开始,如果这个字符是正号或者负号,直接取出这个字符,后面尽可能多的跟随十进制数字,
而一旦遇到非整数的字符,直接返回这个字符之前的整数,后面的字符全部放弃,不会对函数造成影响。
如果遇到的第一个非空格字符不是一个有效的整数字符,参数指针为空或者仅包含空格字符,这些情况下,不执行转换直接返回0;
eg:
int main()
{
const char *str1 = "123";
const char *str2 = "-123abc12";
const char *str3 = "abc";
int value1 = atoi(str1);
int value2 = atoi(str2);
int value3 = atoi(str3);
printf("Value of str1: %d\n", value1);
printf("Value of str2: %d\n", value2);
printf("Value of str3: %d\n", value3);
return 0;
}
结果:
Value of str1: 123
Valueof str2: -123
Value of str3: 0
<08>将负数变为正数
#include <stdio.h>
int turn(int a)
{
a = ~a + 1;
return a;
}
int main()
{
printf("%d\n", turn(5));
printf("%d\n", turn(0));
printf("%d\n", turn(-1));
return 0;
}
输出:
-5
0
1
<09> strtok 字符串切割函数
以下是两种字符串切割到某个字母前的函数:
int main () {
char str[] = "hello world";
char *token;
/* 获取第一个子字符串 */
token = strtok(str, "l");
return 0;
}
输出结果为:he
<10>strstr()函数
strstr函数是在一个字符串中查找另一个字符串的第一次出现,并返回该位置的指针,如果找不到,则返回NULL。
用法1:找到了所查找的字符串,则打印出从第一次找到的那个位置开始后面的所有字符;
int main()
{
char str1[] = "hello world!";
char str2[] = "world!";
char* ret = strstr(str1, str2);
if (ret == NULL)
printf("未找到!\n");
else
printf("%s\n", ret);
return 0;
}
运行结果:world!
用法2:函数返回的指针指向的是str1字符串中匹配到的位置,因此可以通过指针的偏移量来得到具体的位置
int main()
{
char str1[] = "hello world!";
char str2[] = "world!";
char* ret = strstr(str1, str2);
if (ret == NULL)
printf("找不到!\n");
else
printf("%d\n", ret - str1);
return 0;
}
运行结果:6
<11>void *memcpy( void *dest, const void *src, size_t count );
参数 dest src count
解析 目标空间地址 要拷贝内容空间源地址 拷贝内容字节数
memcpy函数不像strncpy函数一样只能拷贝字符,memcpy函数可以拷贝任意类型的内容
int main(){
int arr1[10]={1,2,3,4,5,6,7,8,9,10};
int arr2[5] ={0};
memcpy(arr2,arr1,20);
return 0;
}
以上面为例,我们想把arr1中前五个元素传中arr2,在memcpy就要写20。因为arr1为整型数组,
其中包含的元素也是整型,是4个字节。而我们要传递五个整型,所以就是4*5个字节
1.一定要注意memcpy第三个参数传的是要传内容的字节数
2.目的空间大小一定要能容纳memcpy所拷贝的内容
<12>strlen:
作用: 用于计算一个指定的字符串的长度。(计算的标准是从指定分入口地址开始一直往后面计算直到遇到 \0 结束符为止,且\0不计算在内)
函数分析:
头文件:
#include <string.h>
函数原型:
size_t strlen(const char *s);
参数分析:
s --> 需要计算长度的入口地址
返回值:
返回字符串s 的长度 (不包括结束符)
<13>函数strtok
作用:用于对指定字符串按照指定的分隔符进行分隔。
注意:
- 该函数会修改 指针S所指向的内存的内容
- 第一个参数s在第一次调用分割函数的时候必须传递实参
- 以后每一次调用的第一个参数都必须写 NULL 让他在上一次的基础上继续分割
- 如果每一次调用都给了实际参数那么则会从新初始化需要分割目标字符串
- 第一个参数s在第一次调用分割函数的时候必须传递实参
函数分析:
头文件 :
#include <string.h>
定义函数
char * strtok(char *s, const char *delim);
参数分析:
s --> 需要分割的目标字符串 [该指针指向的内存必须是可读写的] (不允许只读)
delim --> 指定的分隔符 (常目标指针)
返回值:
成功 返回下一个分割好的字符串
失败 或无法再进行分隔这 返回NULL
<14>函数strcat与strncat![](https://i-blog.csdnimg.cn/blog_migrate/16b73bfab782247a6b3b1108f180eea0.png)
注意:
-
- 这两个函数的功能,都是将 src 中的字符串,复制拼接到 dest 的末尾。
- strcat() 没有边界控制,因此可能会由于 src 的过长而导致内存溢出(结束条件只有一个 就是遇到src中的结束符 '\0')。
- strncat() 有边界控制,最多复制 n+1 个字符(其中最后一个是 ‘\0’ )到 dest 的末尾
- 结束条件:
- 遇到SRC结束符
- 达到 N +1的大小 (+1 是为了留空结束符)
- 结束条件:
<15>函数strcpy与strncpy ![](https://i-blog.csdnimg.cn/blog_migrate/4359e0f90325737cca801488fad91c98.png)
注意:
- strcpy 与strncpy 都是用于把src字符串拷贝到 dest 中
- 区别在于strcpy 只有一个结束调节就是遇到 src中的结束符, 因此可能会导致拷贝过程中出现溢出的问题
- 而strncpy 则有两个结束条件, 一个是遇到 src中的结束符 , 另一个则是 满足用户的期望字节数
- 注意strncpy 在拷贝的时候不会主动增加结束符 \0
<16>函数strcmp与strncmp![](https://i-blog.csdnimg.cn/blog_migrate/06d2aa83701df36543e8ffb05af5d6a0.png)
注意:
- 这两个函数都是用来比较字符串是否相等
- strcmp 比较时的结束条件只有两个 遇到结束符或遇到不相同的字符
- strncmp 比较时的结束条件只有三个 遇到结束符或遇到不相同的字符以及达到用户指定的数量
<17>函数strchr与strrchr
- 注意:
-
- 这两个函数的功能,都是在指定的字符串 s 中,试图找到字符 c。
- strchr() 从左往右找,找第一个出现的字符。
- strrchr() 从左往右找,找最后一个出现的字符。
- 字符串结束标记 ‘\0’ 被认为是字符串的一部分。??????
<18>函数memcmp
头文件:
#include <string.h>
函数原型:
int memcmp(const void *s1, const void *s2, size_t n);
参数分析:
s1 --> 需要比较的内存1
s2 --> 需要比较的内存2
n --> 期望比较的内存大小 n字节
返回值:
返回差值 0 表示相等
memcmp 与 strcmp 的区别:
strncmp 的结束条件有: 出现差异 + 遇到结束符 + 用户指定比较的长度
memcmp 的结束条件有: 出现差异 + 用户指定比较的长度