c++ 快速复习第一部份

去年有事无事学过一c++ ,,由于工作用不上,学来没有用,所以学得乱七八的,最近需要复习一下,因为最近想学习一下硬 件相关

第一   引用头文件和自定义头

复制代码
#include <iostream>
using namespace std;   //引用命名空间可以避免使用::语法
int main()
{
默认输出写法:
std::cout << "Hello, world!" << std::endl;
cout << "Hello World!" << endl;
return 0;
}
复制代码
使用建议
对于小型代码或示例代码,使用 using namespace std; 通常是安全的。对于大型项目或库,建议显式地使用 std:: 前缀,以避免潜在的名称冲突,并提高代码的可读性
和可维护性。std 命名空间是 C++ 编程的基础部分,理解和正确使用它对于编写健壮和高效的 C++ 代码至关重要。 

常见第三方库

1
2
3
4
5
6
7
8
std包含的内容
std 命名空间包含了许多类、函数和对象,例如:
输入输出库(如 std::cout , std::cin , std::endl )
容器类(如 std::vector , std::map , std::set )
字符串类( std::string )
异常类( std::exception 和相关子类)
算法(如 std::sort , std::find )
实用工具(如 std::pair , std::tuple )

自定义库,新建一上h 文件

1
2
3
4
5
6
7
8
9
10
11
12
#ifndef CIR_H
#define CIR_H
namespace Cir {
const double PI = 3.141592653;
double areaOfCircle(double radius){
return PI*radius*radius;
}
double lenthOfCircle(double radius){
return 2*PI*radius;
}
}
#endif // CIR_H

然后主类引用,总结就是可能把一些类的定义写在别的文件,主类写逻辑

复制代码
#include "cir.h"
#include <stdio.h>
int main()
{
double radius = 5;
printf("半径为%f的圆,周长为%f,面积为%f\n",
radius,Cir::lenthOfCircle(radius), Cir::areaOfCircle(radius));
return 0;
}
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
在 C++ 中, <climits> (或在 C 中是 <limits.h> )是一个标准头文件,提供了关于整型限制的信息。这个头文件中定义了各种整型数据类型的属性,如最大值、最小值等。使用这些信息可以帮助你了
解在特定编译器和平台上各种数据类型的大小和范围。
如何使用 <climits>
要使用 <climits> 中定义的常量,你首先需要包含这个头文件:
#include <climits>
然后,你可以使用它提供的各种常量,例如:
INT_MAX : int 类型的最大值。
INT_MIN : int 类型的最小值。
UINT_MAX : unsigned int 类型的最大值。
LONG_MAX : long int 类型的最大值。
LONG_MIN : long int 类型的最小值。
LLONG_MAX : long long int 类型的最大值。
LLONG_MIN : long long int 类型的最小值。
示例代码
下面是一个简单的示例,展示了如何使用 <climits> 中的值:
#include <iostream>
#include <climits>
int main() {
std::cout << "The range of int is from " << INT_MIN << " to " << INT_MAX <<
std::endl;
std::cout << "The maximum value of unsigned int is " << UINT_MAX <<
std::endl;
std::cout << "The range of long long is from " << LLONG_MIN << " to " <<
LLONG_MAX << std::endl;
return 0;
}
这个程序会输出 int 、 unsigned int long long int 类型的最大值和最小值。
注意事项
<climits> 提供的是编译时确定的常量,这意味着这些值在编译时就已经固定,根据编译器和平台
的不同而可能有所不同。
使用这些限制值可以帮助你编写更可移植和安全的代码,特别是在处理可能超出数据类型范围的操
作时

 

基础部份,系统常见输入输出语法  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
cin 用于从标准输入(通常是键盘)读取数据。
cout 用于将数据输出到标准输出(通常是屏幕)。#include<iostream>
 
int main() {
    int number;
    std::cout << "Enter a number: ";
    std::cin >> number;
    std::cout << "You entered: "<< number<< std::endl;
    return 0;
}
cerr 用于输出错误消息和调试信息。 #include<iostream>
 
int main() {
    std::cerr << "An error occurred!"<< std::endl;
    return 1;
}
#include<iostream>
 
int main() {
    std::clog << "An error occurred!"<< std::endl;
    return 1;
}
#include<iostream>
#include<fstream>
#include<string>
 
int main() {
    std::ifstream file("example.txt");
    std::string line;
 
    if (file.is_open()) {
        while (std::getline(file, line)) {
            std::cout<< line<< std::endl;
        }
        file.close();
    } else {
        std::cerr << "Unable to open file"<< std::endl;
    }
 
    return 0;
}

  

 clog 用于记录错误和日志信息。

  ifstream 用于从文件读取数据。 ofstream 用于将数据写入文件。

  

 基础数据类型 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
C++ 的基础类型主要包括以下几类:
整型(Integer Types)
int8_t 或 signed char: 8位有符号整数
uint8_t 或 unsigned char: 8位无符号整数
int16_t 或 signed short: 16位有符号整数
uint16_t 或 unsigned short: 16位无符号整数
int32_t 或 signed int: 32位有符号整数
uint32_t 或 unsigned int: 32位无符号整数
int64_t 或 signed long long: 64位有符号整数
uint64_t 或 unsigned long long: 64位无符号整数
此外,还有 short, int, long, long long,但这些类型的大小取决于具体的编译器和平台。
浮点型(Floating-Point Types)
float: 单精度浮点数
double: 双精度浮点数
long double: 扩展的双精度浮点数(精度和范围可能因编译器和平台而异)
字符型(Character Types)
char: 字符类型,可以是有符号的或无符号的,取决于编译器和平台。
wchar_t: 宽字符类型,用于支持多字节字符集,如Unicode。
char8_t (C++20起): 用于UTF-8编码的字符。
char16_t: 用于UTF-16编码的字符。
char32_t: 用于UTF-32编码的字符。
布尔型(Boolean Types)
bool: 布尔类型,可以表示真(true)或假(false)。
空类型(Void Type)
void: 表示没有类型,通常用于函数返回类型,表示该函数不返回任何值。
复合类型(Compound Types)(这些不是基础类型,但经常与基础类型一起使用)
数组(Array)
结构体(Struct)
联合体(Union)
枚举(Enumeration)
指针(Pointer)等。
需要注意的是,C++ 标准并没有严格规定某些类型(如 int, long 等)的具体大小,这取决于编译器和目标平台。为了编写可移植的代码,通常建议使用固定宽度的整数类型(如 int32_t)或基于特定需求的类型别名。
另外,C++11 及其后续版本引入了一些新的类型别名和关键字,如 nullptr_t(用于表示空指针的类型),以及用于表示特定大小的整数类型的别名(如 int8_t, uint16_t 等)。这些都在 <cstdint> 或 <stdint.h> 头文件中定义。

  

1
2
3
4
5
6
7
8
9
10
数据类型    描述  位数 (通常情况下)  用途
int 整型  至少 16 位 一般的整数运算
short int   短整型 至少 16 位 较小范围的整数,节省空间
long int    长整型 至少 32 位 较大范围的整数运算
long long   更长的整型   至少 64位  处理非常大的整数
unsigned int    无符号整型   同 int,通常为32 位   只能为正数的整数运算
float   单精度浮点类型 32 位    需要小数点的数值运算,精度较低
double  双精度浮点类型 64 位    需要高精度的数值运算float单精度浮点类型32 位存储小数,精度约为6-7位有效数字double双精度浮点类型64 位存储小数,提供更高的精度和范围long double扩展精度浮点类型80 位或更多提供比double更高的精度和范围char字符型8 位存储单个字符或作为小整数使用unsigned char无符号字符型8 位存储无符号的单个字符或数值signed char有符号字符型8 位存储有符号的单个字符或数值bool布尔型通常由编译器决定存储逻辑值(真/假)wchar_t宽字符类型通常为16位或32位存储宽字符,用于支持多语言
注意:这里的位数是“至少”的要求,实际实现中可能会更多,具体取决于编译器和平台。例如,现代的64位系统中,int通常是32位的,而long int可能是64位的。另外“用途”一栏是简要描述,实际应用中这些类型的用途可能更加多样和复杂。
最后,请注意,“釐靼覽裉精度浮点类型”似乎是一个输入错误或乱码,我假设你指的是“单精度浮点类型”,所以在上面的表格中我进行了更正。如果这不是你的意思,请提供更多信息以便进行准确的修正。
1
2
3
4
5
6
7
8
9
10
11
12
13
宽字符的用法
#include <iostream>
#include <locale>
#include <wchar.h>
int main() {
// 设置本地化以支持宽字符
std::setlocale(LC_ALL, "");
// 使用 wchar_t 类型定义一个宽字符串
wchar_t wstr[] = L"你好,世界!";
// 在 C++ 中打印宽字符串
std::wcout << wstr << std::endl;
return 0;
}

宽字符影起mysql建表消失

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
通过某种方式(如命令行或数据库开发工具等)在数据库 test 中创建了一个名为 lang 的表。表结构如下:
CREATE TABLE `lang` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
通过 SHOW TABLES; 命令,我们可以确认这个表的存在。
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| a1             |
| lang          |
| t1             |
| z1             |
+----------------+
4 rows in set (0.00 sec)
但是,当你尝试在 MySQL 客户端执行 SELECT * FROM lang; 查询或者业务程序去连接该表时,却收到了错误信息:
 
mysql> select * from lang;
ERROR 1146 (42S02): Table 'test.lang' doesn't exist
表就这么神奇的消失了。
3原因分析
像见了鬼一样,即使反复多次手动输入查询语法,也无法查询到这个表。我们将建表语句复制到 Sublime Text 文本工具中:
 
图片此时,我们发现了问题:表名后面跟了一个“<0×200b>”的字符。这就是零宽空格,是零宽字符的一种。

 

  

1
2
3
4
5
6
7
解决宽字符带来的问题:
零宽字符是一种特殊的 Unicode 字符,它不占用任何可见空间,因此在大多数情况下是不可见的。然而,它们可以存在于文本中,并且可能对计算机程序产生影响,包括数据库管理系统。在 Unicode 中,U+200B 代表零宽空格,常用于可能需要换行的地方。除此之外,还有其他零宽字符,这里不再赘述。
那么,这像幽灵一样的字符为何会存在? 所谓存在即合理,零宽字符常常被用于数据防爬、信息加密传递、防止敏感词扫描等场景。但在数据库系统里使用,有时候就会出现让人头疼的现象,本文提到的就是其中之一。这些字符虽然不占用任何空间,但可能会破坏 SQL 命令的正确结构,导致后续使用出错。
如何解决?
在创建表之前,将建表语句复制到多个文本编辑工具,检查是否有异常符号提示(一般文本工具可能无法显示零宽字符)。经过尝试 Sublime Text、Visual Studio Code 等工具或插件有提醒零宽字符的功能;还有一些在线网页工具可以查看 Unicode 字符的功能。如果你知道其他能够展示零宽字符的工具,欢迎在评论区留言分享。
在创建表之后,使用 SHOW CREATE TABLE; 命令查看表结构,然后将输出结果复制到上述文本编辑工具中,检查是否有异常符号。
经过多次测试发现,在 MySQL 客户端上执行了 SHOW TABLES; 命令时,含有零宽空格的表名后面的边框线 “|” 与其他行是不对齐的。这可以快速发现问题表,但并不显示具体字符。当然这方式一般不适用于第三方开发工具、业务程序等。

  

 

 
posted @   谢双元小号  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示