C/C++编程输入输出相关函数
1. C输入输出
int a;
int scanf(const char *format, &a);
//标准输入流 stdin 读取输出到缓冲区,遇到回车将缓冲区数据取走。
int printf(const char *format, a);
//输出写入到标准输出流 stdout
注意:在scanf()输入时,最后一个变量后千万不要加空格,会出现意想不到的结果,输入顺序错位。
例如:末尾c输入格式
后面不能加空格
,前面两个变量a和b格式后面加不加都可以。
scanf("%d %d %d ", &a, &b, &c);
//格式控制说明
%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%p 指针的值
%e 指数形式的浮点数
%x, %X 无符号以十六进制表示的整数
%0 无符号以八进制表示的整数
%g 自动选择合适的表示法
//特殊规定字符
\n 换行
\f 清屏并换页
\r 回车
\t Tab符
\xhh 表示一个ASCII码用16进表示,
其中hh是1到2个16进制数
char *gets(char *s)
// 从stdin读取一行到 s 所指向的缓冲区,遇到终止符或 EOF结束;
int puts(const char *s)
// 函数将字符串s和一个尾随的换行符写入到 stdout;
getchar();
putchar(s);
// 函数输入输出单个字符;
字符串格式中区别:(并非是在整数格式中)
scanf
:当遇到回车,空格和tab键会自动在字符串后面添加’\0’,并认为数据结束,但是回车,空格和tab键仍会留在输入的缓冲区中(遇到回车,空格,TAB键,指定宽度,格式错误认为该数据输入结束)。
gets
:可接受回车键之前
输入的所有字符,并用’\0’替代 ‘\n’。回车键不会留在输入缓冲区中(遇到回车认为该数据输入结束)。
printf()
根据格式直接输出。
puts()
在输出字符串时会将’\0’自动转换成’\n’进行输出,也就是说,puts方法输出完字符串后会自动换行。
#include <stdio.h>
int main() {
int a,b;
while(scanf("%d %d",&a, &b) != EOF)//注意while处理多个case
printf("%d\n",a+b);
return 0;
}
2. C++输入输出
在头文件iostream
中定义有两个流类:输入流类istream
和输出流类ostream
,且用这两个类定义了流对象cin和cout:
istream cin;
ostream cout;
cin是一个istream类的对象,它从标准输入设备(键盘)获取数据,程序中的变量通过流提取符“>>”从流中提取数据。流提取符“>>”从流中提取数据时通常跳过输人流中的空格、tab键、换行符等空白字符。注意:只有在输入完数据再按回车键后,该行数据才被送入键盘缓冲区,形成输入流,提取运算符“>>”才能从中提取数据。注意保证从流中读取数据能正常进行。
cout是一个ostream类的对象,它有一个成员运算函数operator<<,每次调用的时候就会向输出设备输出。operator用运算符重载,可以接受不同类型的数据,如整型、浮点型、字符串甚至指针,等等。cout是标准输出设备,一般输出到屏幕。
注意:cout输出的时候,最后面最好加上endl
(end of line)结束换号。
#include <iostream>
using namespace std;
int main() {
int a,b;
while(cin >> a >> b)//注意while处理多个case
cout << a+b << endl;
}
//输入:a b (回车)
cin输入时:输入运算符>>
在读入下一个输入项b前会忽略前一项a后面的空格。
C++输出格式设置:
https://blog.csdn.net/xyqqwer/article/details/83471973
3. 动态申请一维数组和二维数组
1) malloc动态开辟与释放一维数组
//动态开辟一维数组
void dynamicCreate1Array()
{
int m;
int i;
int *p;
printf("请输入开辟的数组长度:");
scanf("%d",&m);
p = (int*)malloc(sizeof(int)*m);//动态开辟
printf("请输入数据:");
for(i = 0; i < m ; i++)
scanf("%d",&p[i]);
printf("输出数据:\n");
for(i = 0; i < m; i++)
printf("%d ",p[i]);
free(p);
}
2) malloc/free 动态开辟二维数组
//动态开辟二维数组
void dynamicCreate2Array()
{
int m,n;
int i,j;
int **p;
printf("请输入数组行和列:");
scanf("%d%d",&m,&n);
p = (int**)malloc(sizeof(int*)*m); //开辟行
for(i = 0; i < m; i++)
{
*(p+i) = (int*)malloc(sizeof(int)*n);//开辟列
}
//输入数据
printf("请输入数:");
for(i = 0 ; i < m;i++)
for(j = 0; j < n;j++)
scanf("%d",&p[i][j]);
//输出数据
for(i = 0 ; i < m;i++)
{
for(j = 0; j < n;j++)
{
printf("%3d ",p[i][j]);
}
printf("\n");
}
//释放开辟的二维空间
for(i = 0; i < m;i++)
free(*(p+i)); //注意二维数组的释放
}
3)new/delete 动态申请一维数组
void DynamicCreate1Array()
{
int len;
cout<<"请输入长度:";
cin>>len;
int *p = new int[len];
cout<<"请输入数据:";
for(int i = 0; i < len; i++)
cin>>p[i];
cout<<"输出数据:"<<endl;
for(i = 0; i < len; i++)
cout<<setw(4)<<p[i];
delete[] p;
}
4)new/delete 动态申请二维数组
void DynamicCreate2Array()
{
int m,n;
cout<<"请输入行和列:";
cin>>m>>n;
//动态开辟空间
int **p = new int*[m]; //开辟行
for(int i = 0; i < m; i++)
p[i] = new int[n]; //开辟列
cout<<"请输入数据:";
for(i = 0 ; i < m ; i++)
for(int j = 0; j < n; j++)
cin>>p[i][j];
cout<<"输出数据:"<<endl;
for(i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
cout<<setw(3)<<p[i][j];
cout<<endl;
}
//释放开辟的资源
for(i = 0; i < m; i++)
delete[] p[i];
delete[] p;
}
5) STL中的vector动态申请二维数组
void VectorCreate()
{
int m,n;
cout<<"请输入行和列:";
cin>>m>>n;
//注意下面这一行:vector <int后两个 "> "之间要有空格!否则会被认为是重载 "> > "。
vector<vector<int> > p(m,vector<int>(n));
//vector<vector<int> > p(m,vector<int>(n, 0)); //二维数组初始化为0
//vector<int> p(n, 0); //动态申请一维数组并初始化为0
cout<<"请输入数据:";
for(int i = 0 ; i < m ; i++)
for(int j = 0; j < n; j++)
cin>>p[i][j];
cout<<"输出数据:"<<endl;
for(i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
cout<<setw(3)<<p[i][j];
cout<<endl;
}
}
4. C++中的最值
-
INT_MAX,INT_MIN数值大小:
因为int占4字节32位,根据二进制编码的规则,INT_MAX = 2^31-1,INT_MIN= -2^31.C/C++中,所有超过该限值的数,都会出现溢出,出现warning,但是并不会出现error。如果想表示的整数超过了该限值,可以使用长整型long long 占8字节64位。 -
INT_MIN在标准头文件limits.h中定义。
#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX - 1)//这里没有简单地将INT_MIN赋值成-2147483647,是因为-2147483648对于编译器而言是个表达式,而2147483648对于32-bit整数是无法表示的,
//所以经过这个表达式的结果是未定义的。在GCC上直接写-2147483648后,编译器给出了警告,说结果是unsigned。
5. C/C++构建链表和二叉树结构
C/C++构建链表
/* 基本的单链表节点 */
struct ListNode {
int val;
ListNode *next;
};
//动态创建链表
ListNode *p = new ListNode; //不带初始化参数
ListNode *p = new ListNode(1); //带初始化参数
//释放链表
delete p;
//链表的迭代遍历
void traverse(ListNode head) {
for (ListNode p = head; p != null; p = p.next) {
// 迭代访问 p.val
}
}
//链表的递归遍历
void traverse(ListNode head) {
// 递归访问 head.val
traverse(head.next)
}
C/C++构建二叉树
//C Definition for a binary tree node.
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
//C++ Definition for a binary tree node.
class TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
//二叉树递归遍历
void traverse(TreeNode *root) {
traverse(root.left)
traverse(root.right)
}
6. C++在线编程常用库
#include <iostream> //io库,输入输出流
#include <algorithm> //C++的标准算法库,它主要应用在容器上
#include <stack> //stack(适配器)
#include <queue> //queue、priority_queue(适配器)
#include <vector> //动态数组(容器)
#include <deque> //双端队列(容器)
#include <list> //双向链表
#include <map> //map和multimap
#include <set> //set和multiset
#include <string> //字符串
#include <cmath> //数学公式,相当于c中的<math.h>
#include <mem.h> //数学公式
#include <functional> //仿函数
//当使用 iostream 的时候,该头文件没有定义全局命名空间,必须使用namespace std; 这样才能正确使用cin cout等操作符。
using namespace std; //相当于定义全部变量,cpp文件都可直接使用iostream库
7. rand随机值的产生
产生一定范围随机数的通用表示公式是:
要取得[0,n) 就是rand()%n 表示 从0到n-1的数
要取得[a,b)的随机整数,使用(rand() % (b-a))+ a;
要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a;
要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1;
通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。
要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。
要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。
参考链接: