C
1.C语言函数题需要输入/输出字符串,由于C语言无字符串类型,故使用字符型数组
printf 输出
char c[ ] = "I am happy";
printf("%s", c);
//必须得是字符数组名,按字符数组名c找到其数组起始地址,然后逐个输出其中的字符,直到遇到'\0'为止。
scanf 输入
//scanf 逐个字符输入
char c[10];
for(int i = 0; i < 10; i++){
scanf("%c", &c[i]);
}
//scanf 输入一个字符串
char c[10];
scanf("%s",c); //注意,不需要&,系统自动在字符串后面加一个'\0'结束符。
数组名称本身就代表了这个数组第一个元素的地址,所以不需要再加取地址运算符
gets 输入
gets(字符数组);
从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。它读入全部字符(包括空格),直到遇到回车为止。gets()函数并不读取换行符’\n’,它会把换行符替换成空字符’\0’,作为c语言字符串结束的标志。
缺陷:不检查数组是否能够装得下输入行
puts输出
puts(字符数组);
将一个字符串(以’\0’结束的字符数组)输出到终端。在输出时将字符串结束标志’\0’转换成’\n’,即输出完字符串后换行。
strcpy()
strcpy(dest, src); //dest指向用于存储复制内容的目标数组。src要复制的字符串
2.scanf()返回值的利用
while(scanf("%d %d",&a,&a)==2){}
如果a和b都被成功读入,那么scanf的返回值就是2
如果只有a被成功读入,返回值为1
如果a和b都未被成功读入,返回值为0
如果遇到错误或遇到end of file,返回值为EOF(定义为-1)
此外写成2 == scanf()格式是一种编程风格~防止由于程序员手误写成"="
while (~scanf("%d%d",&m,&n)){}
//等价于
while (scanf("%d%d",&m,&n)!=EOF)
ACM中比较常见,其功能是循环从输入流读取m和n,直到遇到EOF为止
~是按位取反,-1【EOF】十六进制补码表示为0x ffffffff,f是二进制的1111,取反后就全部变成0了,于是while结束。只有返回值为EOF(即-1)时,其取反的的值(即while循环的判断条件)才为0,才能结束循环,其它输入情况下(无论是否输入成功)while循环的判断条件为非0,即为真。
漏洞:一但输入的值为字母、符号之类的,scanf赋值不成功把读到的内容又返回到stdin的缓冲区(假设这个值为t),其取反得到的值使while又进入到下一次循环,scanf又从stdin缓冲区里读到了原先吐回的t,如此成了死循环
3.atof()函数
atof()
把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)
double atof(const char *str)
4.fabs(num)<1e-6
浮点数因为存储形式的原因不能直接和0值比较,当要判断一个浮点数是否等于0时需要这样写
5.strstr()函数
strstr()
返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null
char *strstr(const char *haystack, const char *needle)
CPP
1.stringstream字符串流
stringstream
是字符串流,它将流与存储在内存中的string对象绑定起来。
运算符<<
将数据传递给 stringstream 对象(与通过<<
使用cout
对象的方法相同)
按照空格提取字符串,运算符>>
将数据从 stringstream 对象传递给字符串(与通过>>
使用cin
相同)
2.c_str()函数
c_str()
函数生成一个const char*指针,指向以空字符终止的数组, 内容与本string串相同
const char *c_str();
3.输出设置 ---- 小数点位数保留&前导0
小数点的保留
double PI = 3.1415926;
cout << setprecision(n) << PI; //3.14三位有效数
cout << setiosflags(ios::fixed)<< setprecision(n) << PI; //3.141小数点后三位
在用浮点表示的输出中,setprecision(n)表示有效位数,C++默认的流输出数值有效位是6。
在用定点表示的输出中,setprecision(n)表示小数位数,setiosflags(ios::fixed)是用定点方式表示实数。
输出前导0/其他字符
setw(n)
:预设宽度
cout<<setw(6)<<12345<<endl;
setfill(char c)
:若在预设宽度中还存在没用完的宽度大小,则用设置字符c填充
cout<<setfill('#')<<setw(6)<<12345<<endl;
改变进制输出
setbase(n)
:将输出数据转换为n进制
cout<<setbase(2)<<255<<endl;
4.vector之resize()函数
vector<int> v;
v.resize(N);
for(int i=0;i<N;i++) cin >> v[i];
//给vector分配内存后可以按一定数量将数据读入数组中
5.vector之构造函数
vector<int> second (4,100);
// 定义four ints with value 100
//相当于int a [4]; memset(a, 100, sizeof(a));
6.结构体自定义构造函数
struct node{
int v,w;
};
vector<node> adj[N];
//以上写法想把node型变量加入adj数组中时,需要定义一个node型临时变量tmp
//node tmp;
//tmp.v = 3;
//tmp.w = 4;
//adg[1].push_back(tmp);
//更快的做法是定义结构体node的构造参数
struct node{
int v,w;
node(int _v,int _w):v(_v),w(_w){} //构造函数
};
//这样就能不定义临时变量来实现加边操作
adj[1].push_back(node(3,4));