C/C++基础整理(一)

在已经学习过C语⾔的前提下,学习C++并使⽤它刷算法的学习成本非常低~
这里做一点C语言重点总结和部分C++特性(C++向下兼容C,因此C语言的语法在C++中同样适用)以便于刷算法

#数据类型

基本数据类型

类型 取值范围 大致范围
int -231  ~ +(231-1) -2 ×10 9 ~ 2 ×10 9
long long -263 ~ (263-1) -9 ×10 18 ~ 9 ×10 18
float -2128 ~ +2128 实际精度6~7位
double -21024 ~ +21024 实际精度15~16位
char -128 ~ +127 -128 ~ +127
bool 0(false) or 1(true) 0(false) or 1(true)
  • 对于整型的使用,绝对值在109范围内整数可定义为int

  • 对于浮点型,尽量不要使用float,全部使用double来存储

  • 字符型

    • 字符常量(必须是单个字符)必须用单引号标注 'a'
    • 字符常量使用ASCII码统一编码,0-9、A-Z、a-z等都是可显示字符,它们的ASCII码分别是4857、6590、97~122,须记住小写字母比大写字母的ASCII码大32
  • 布尔型 头文件加stdbool.h

    bool 变量量有两个值, falsetrue ,以前⽤用C语⾔的时候都是⽤int 的0 和1 表示falsetrue的,现在C++⾥面引⼊了这个叫做bool (布尔)的变量,而且C++把所有⾮非零值解释为true ,零值解释为false 所以直接赋值一个数字给bool 变量也是可以的~它会自动根据int 值是不是零来决定给bool 变量赋值true 还是false

    bool flag = true;
    bool flag2 = -2; 		// flag2为true
    bool flag3 = 0; 		// flag3为false
    
  • 符号常量和const常量

    #define pi 3.14
    const double pi = 3.14
    

字符串

C中的字符串

  • 没有单独一种数据类型可以存储,只能用字符数组方式,字符串常量可以作为初值赋给字符数组,并使用%s格式输出
char str[20] = "Hello";
printf("%s",str);
  • <string.h>头文件中常用API

    • strlen(str) 得到字符数组中第一个\0前面的字符个数,注意字符串的存储方式

    • strcmp(str1, str2) 返回两个字符串大小的比较结果

      比较原则:字典序

      str1[0···k-1] == str2[0···k-1]、str1[k] < str[k],那么就说str1的字典序小于str2

      str1 < str2 返回负整数

      str1 = str2 返回0

      str1 > str2 返回正整数

    • strcpy(str1, str2) 把字符数组2复制给字符数组1,这里复制包括结束符\0

    • strcat(str1, str2) 把字符数组2接到字符数组1后面

#include<stdio.h>
#include<string.h>

int main(void){
  	char str1[10], str2[10];
  	gets(str1);
  	gets(str2);
  	int len = strlen(str1);
  	int cmp = strcmp(str1, str2);
  	strcpy(str1, str2);
  	strcat(str1, str2);
  	return 0;
}

C++中字符串string类

以前⽤用char[] 的⽅方式处理理字符串串很繁琐,现在有了string 类,定义、拼接、输出、处理理都更更加简单啦~不过string 只能⽤用cincout 处理,无法用scanfprintf 处理

string s = "hello world"; // 赋值字符串串
string s2 = s;
string s3 = s + s2; 			// 字符串串拼接直接⽤用+号就可以
string s4;
cin >> s4; 								// 读⼊入字符串串
cout << s; 								// 输出字符串串
  • string类中常用API
    • str.length() 获取str的长度 有几个字符就是长度多少,不存在char[] ⾥面的什么末尾的结束符之类的
    • str.substr() 截取字符串
    • ⽤用cin 读⼊入字符串串的时候,是以空格为分隔符的,如果想要读入一整⾏的字符串,就需要⽤用getline
string s; // 定义⼀一个空字符串串s
getline(cin, s); // 读取⼀一⾏行行的字符串串,包括空格
cout << s.length(); // 输出字符串串s的⻓长度
string s2 = s.substr(4); // 表示从下标4开始⼀一直到结束
string s3 = s.substr(5, 3); // 表示从下标5开始,3个字符

string中一些更加详细的用法在C++标准模板库STL中再做详细整理

输入输出

scanf()、printf()

int n;
char str[10];
scanf("%d", &n);
scanf("%s", str);		//  !!!
printf("%d", n);
  • 数组名称本身就代表了这个数组第一个元素的地址,所以不需要再加取地址运算符,再scanf()中,除了char数组整个输入的情况下不加&之外,其他变量类型都需要加&

  • 格式控制

    • %md 可以使不足m位的int型以m位进行右对齐输出,高位空格补齐
    • %0d 不足m位时,前面高位补0
    • %.mf 浮点数保留m位输出 四舍五入用round()函数
    • %c char
    • %s char[]
    • %lld long long
  • scanf的双引号的内容其实就是整个输入,只不过把数据换成它们对应的格式符并把变量的地址按次序写在后面而已

  • 除了%c外,scanf对其他格式控制符(如%d)的输入是以空白符(空格、换行等)为结束标志的,%c 是可以读入空格和换行的我们看下面两个例子

#include <stdio.h>

int main(int argc, char const *argv[])
{
	char str[10];
	scanf("%s", str);
	printf("%s\n", str);
	return 0;
}

输入

abcd efg

输出

abcd
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int a;
    char str[10];
    char c;
    scanf("%d%c%s",&a, &c, str);
    printf("a = %d, c = %c, str = %s\n",a, c, str);
    return 0;
}

输入

1 a bcd

输出

a = 1, c =  , str = a

getchar()、putchar()

注意:getchar()可接受换行符(Enter)和空格符(Space)

#include <stdio.h>

int main(int argc, char const *argv[])
{
    char c1, c2, c3;
    c1 = getchar();
    c2 = getchar();
    c3 = getchar();
    putchar(c1);
    putchar(c2);
    putchar(c3);
    return 0;
}

输入1

abc

输出1

abc

输入2

a b c

输出2

a b

输入3

a
b

输出3

a
b

gets()、puts()

gets() 用来输入一行字符串并将其存放于一维数组中, gets()识别**换行符\n**作为输入结束

puts()用来输出一行字符串,并紧跟一个换行

#include <stdio.h>

int main(int argc, char const *argv[])
{
    char str[10];
    gets(str);
    puts(str);
    return 0;	
}

输入

abc def

输出

abc def

!!字符数组存放方式

由于字符数组是由若干个char类型的元素组成,因此字符数组的每一位都是一个char字符,末尾都有一个空字符\0表示存放的字符串结尾

空字符\0在使用gets获scanf输入字符串时会自动添加在输入的字符串后面,并且占用一个字符位、puts和printf就是通过识别\0作为字符串的结尾来输出的

  • 特别提醒

开辟字符串数组的时候千万要记得字符数组的长度一定要比实际存储字符串长度至少多1(\0)

适用scanf函数的%s格式或者gets函数输入字符串时,可不用担心\0的问题,但如果适用getchar()一定要在输入的每个字符串后面加入\0

#include<stdio.h>

int main(void){
    char str[15];
    for(int i = 0; i < 3; i++){
      str[i] = getchar();
    }
    puts(str);
    return 0;
}

输入

abc

输出

abc?@w??

以上结果是《算法笔记》里面输出结果,但在我的Mac里跑出来却没有乱码,目前还不清楚是否为clang++编译器的原因

cin、cout

cin与cout是C++中输入与输出函数,需添加头文件

#include<iostream>
using namespace std;

可不指定格式,也不需要加取地址运算符&,可在后面继续扩展

cin >> n >> db >> c >> str;
cout << n << "hello" << db << str << endl;		// endl表示换行
cout << n << " " << str;	//输出中间没有空格要自己进行补全
#include <iostream>
using namespace std;

int main(void){
      int a;
      char c;
      double db;
      char str[10];
      cin >> a >> c >> db >> str;
      cout<< a << c << db << str << endl;
      return 0;
}

输入1

123 a 3.14 Rick

输出1

123a3.14Rick

输入2

123a3.14Rick

输出2

123a3.14Rick

对算法考试而言:并不推荐使用cincout来进行输入和输出,因为他们在输入/输出大量数据的情况下表现非常糟糕,推荐使用scanfprintf进行函数的输入和输出

赞赏