C语言中string操作常用接口
函数名 | 功能描述 | 返回值 |
---|---|---|
strcpy(char *dest, const char *src) | 将 src 指向的字符串复制到 dest 指向的字符数组中,以 \0 结尾 | dest 指针 |
strncpy(char *dest, const char *src, size_t n) | 将 src 指向的字符串的前 n 个字符复制到 dest 指向的字符数组中,以 \0 结尾或者补充 \0 直到 n 个字符 | dest 指针 |
strlen(const char *str) | 返回 str 指向的字符串的长度,不包括最后的 \0 | 字符串长度,类型为 size_t |
strcmp(const char *s1, const char *s2) | 比较两个字符串 s1 和 s2,返回整数表示它们之间的大小关系,相等为 0,s1 大于 s2 为正数,s1 小于 s2 为负数 | 整数,表示字符串的大小关系 |
strncmp(const char *s1, const char *s2, size_t n) | 比较两个字符串 s1 和 s2 的前 n 个字符,返回整数表示它们之间的大小关系,相等为 0,s1 大于 s2 为正数,s1 小于 s2 为负数 | 整数,表示字符串的大小关系 |
隐式转换
C语言中的隐式转换
在C语言中,有许多情况下会发生隐式类型转换。以下列举一些常见的隐式转换情况:
- 整数提升:当一个小于int的整数类型参与运算时,它们会自动转换成int类型。例如,char类型和short类型在表达式中参与运算时,就会自动提升为int类型。
- 算术类型转换:当两个不同的算术类型进行运算时,它们会被转换成同一类型。转换规则为:如果两个类型的位数相同,则转换成无符号类型;如果两个类型的位数不同,则转换成位数较大的类型。
- 浮点数提升:当一个float类型参与运算时,它会自动转换成double类型。
- 函数指针转换:函数名在大多数情况下会自动转换成指向函数的指针。
- 枚举类型转换:枚举类型可以隐式转换成整数类型。
- 指针类型转换:可以将一个void指针隐式转换成任意其他类型的指针。
C++中的隐式转换
C++的隐式转换与C语言类似,但有以下一些区别:
- bool类型:C++中可以将非零值隐式转换成true,将零值隐式转换成false。
- const类型:C++中可以将一个const对象隐式转换成非const对象,但不能将非const对象隐式转换成const对象。
- 类类型转换:C++中可以定义类型转换构造函数和类型转换运算符,从而可以实现自定义类型的隐式转换。
- 派生类转换:C++中可以将指向派生类对象的指针隐式转换成指向基类对象的指针,但不能将指向基类对象的指针隐式转换成指向派生类对象的指针。
枚举类型转换
以下是C语言中枚举类型的隐式转换示例:
#c
Copy code
enum color { RED, GREEN, BLUE };
enum color c = GREEN;
int i = c; // 隐式将枚举类型转换成整数类型
在上述示例中,将枚举类型转换成整数类型是合法的。
函数指针转换
以下是C语言中函数指针的隐式转换示例:
#c
Copy code
void foo() {}
void (*pFoo)() = foo; // 将函数名转换成指向函数的指针
在上述示例中,函数名foo被隐式转换成指向函数的指针pFoo。
总结
C语言和C++语言中都存在隐式类型转换的情况,开发者在使用中需要注意隐式类型转换可能导致编译出错
在C语言中,枚举类型是一种用户自定义类型,它的定义方式类似于结构体。枚举类型是由一组标识符组成的,这些标识符是由用户定义的。枚举类型的主要作用是为程序中的某些数据提供有意义的名字,从而使程序更加易读易懂。
枚举
枚举的定义
在C语言中,定义枚举类型需要使用关键字enum
。枚举类型的一般形式如下:
c
Copy code
enum 枚举类型名 { 标识符1, 标识符2, ... 标识符n };
其中,枚举类型名
是用户定义的枚举类型名称,标识符1
到标识符n
是用户定义的枚举成员,它们表示了枚举类型中的各个取值。每个枚举成员都会被隐式地赋予一个整数值,其默认值从0开始依次递增。用户也可以为枚举成员显式地指定值,如下所示:
c
Copy code
enum weekday { MON = 1, TUE, WED, THU, FRI, SAT, SUN };
上面的代码定义了一个枚举类型weekday
,它有7个枚举成员,分别代表一周的7天。其中,第一个成员MON
的值为1,后面的成员依次递增。
枚举的初始化
枚举类型变量可以用枚举成员来进行初始化,也可以用整数值来进行初始化。如果用整数值来初始化枚举类型变量,需要保证该值是合法的枚举成员值。
c
Copy code
enum color { RED, GREEN, BLUE }; enum color c1 = RED; // 使用枚举成员初始化 enum color c2 = 1; // 使用整数值初始化
枚举的使用
枚举类型变量可以用来定义函数的参数和返回值,也可以用来定义结构体和共用体的成员。
作为函数参数和返回值
c
Copy code
enum color { RED, GREEN, BLUE }; enum color mix(enum color c1, enum color c2) { if (c1 == RED && c2 == GREEN || c1 == GREEN && c2 == RED) { return YELLOW; } else if (c1 == RED && c2 == BLUE || c1 == BLUE && c2 == RED) { return MAGENTA; } else if (c1 == GREEN && c2 == BLUE || c1 == BLUE && c2 == GREEN) { return CYAN; } else { return c1; } }
上面的代码定义了一个枚举类型color
,然后定义了一个函数mix
,它接受两个color
类型的参数,并返回一个color
类型的值。
Volatile
volatile
关键字的一些常见功能和用法
-
防止编译器优化
由于编译器在优化代码时会尝试将一些变量缓存到CPU寄存器中,以提高程序的执行效率,因此在某些情况下可能会导致程序输出结果与预期不符。使用volatile
关键字可以告诉编译器,不要对该变量进行优化,而是每次都从内存中读取变量的值,以确保程序的正确性。 -
处理多线程共享变量
在多线程编程中,如果多个线程共享同一个变量,可能会导致变量值的不一致性,从而产生各种问题。使用volatile
关键字可以告诉编译器,该变量可能被其他线程修改,因此在访问该变量时需要加锁或其他同步机制,以保证线程安全。 -
处理外部设备或中断
在嵌入式系统或其他需要与外部设备或中断交互的系统中,使用volatile
关键字可以确保程序正确地处理外部事件。由于外部设备或中断可能随时修改变量的值,因此需要使用volatile
关键字来告诉编译器,在访问该变量时需要从内存中读取最新的值,以保证程序的正确性。
#include <stdio.h>
int main()
{
volatile int num = 10;
int result;
// 第一个线程修改num的值
num = 20;
// 第二个线程读取num的值
result = num;
printf("num = %d, result = %d\n", num, result);
return 0;
}