写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。
标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。
点击此处进入学习日记的总目录
格式说明符 | 解释 |
---|---|
%d | 用来输入和输出int |
%ld | 用来输入和输出long int |
%lld | 用来输入和输出long long int |
%hd | 用来输入和输出short |
%i | 用来输入和输出有符号十进制整数 |
%u | 用来输入和输出无符号十进制整数 |
%lu | 用来输入和输出无符号十进制长整数 |
%llu | 用来输入和输出无符号十进制长长整数 |
%hu | 用来输入和输出无符号短十进制整数 |
%o | 用来输入和输出八进制整数 |
%lo | 用来输入和输出长八进制整数 |
%ho | 用来输入和输出短八进制整数 |
%#o | 用来输出八进制整数,数字前有0 |
%x | 用来输入和输出十六制整数,字母小写 |
%#x | 用来输出十六制整数,字母小写,数字前有0x |
%lx | 用来输入和输出长十六制整数,字母小写 |
%X | 用来输入和输出十六制整数,字母大写 |
%#X | 用来输出十六制整数,字母大写 ,数字前有0X |
%lX | 用来输入和输出长十六制整数,字母大写 |
%c | 用来输入和输出单个字符 |
%s | 用来输入和输出一串字符串 输入时遇空格,制表符或换行符结束 输出时连格式说明符一起输出 printf("%s","%d%f",a,b);输出 %d%f |
%f | 用来输入和输出float,输出double |
%lf | 用来输入和输出double(double输出用%f和%lf都可以) |
%Lf | 用来输入和输出long double |
%e | 用来输入和输出指数,字母小写 |
%le | 用来输入和输出长指数,字母小写 |
%E | 用来输入和输出指数,字母大写 |
%lE | 用来输入和输出长指数,字母大写 |
%g | 用来输入和输出指数或float(输出最短的一种),字母小写 |
%lg | 用来输入和输出长指数或double(输出最短的一种),字母小写 |
%G | 用来输入和输出指数或float(输出最短的一种),字母大写 |
%lG | 用来输入和输出长指数或double(输出最短的一种),字母大写 |
格式说明符 | 解释 |
---|---|
%*(所有类型),如%*d | 用来输入一个数,字符或字符串而不赋值(跳过无关输入) 如scanf(“%d%*c%d”,&a,&b); 这样就可以只将1+2中的1和2赋值给a和b。 |
%m(所有类型),其中m为常数 | 限定输入范围,如scanf(“%4d”,&a)时输入123456,只把1234赋值给a |
,(逗号) | 无实际用处,仅用于美观。如scanf(“%d,%d,%d”,&a,&b,&c); |
-(横杠) :(冒号) | 方便日期等输入,但不赋值 scanf(“%d-%d-%d”,&a,&b,&c);需输入2018-11-20 scanf(“%d:%d:%d”:&a,&b,&c);需输入2018:11:20 |
所有字符串,符号(包括空格) 数字(不与输入数相挨) | 任何所写的东西都必须如横杠一般先输入(不赋值),不然系统报错 scanf(“%d 456 %d”,&a,&b); 需输入 1 456 7(1和7之间有 456 (前后各一个空格)) 结果为a=1 b=7 |
格式说明符 | 解释 |
---|---|
%m.nd %-m.nd (m和n为常数) | m用于在d位数小于m时补空格(右对齐)d位数大于m时忽略 如%5d,输出123, 123(123前面两个空格) .n用于在d位数小于n时补0(右对齐)d位数大于n时忽略 如%.5d,输出123, 00123(123前面两个0) %-m.nd则为左对齐 |
%m.nf %m.nlf %m.nLf %-m.nf %-m.nlf %-m.nLf | m用于在小数位数小于m时补空格(右对齐) 小数位数大于m时忽略 (小数点算一位) 如%6f 需输出3.14 结果为 3.14(3.14前面两个空格) .n用于控制小数位数 小数部分长度大于n则四舍五入 小数部分长度小于于n则补0 如%.6f 需输出3.14 结果为3.140000 如%6f 需输出3.1415926 结果为3.141593 %-m.nf %-m.nlf %-m.nLf 则为左对齐 |
%m.ns %-m.ns | m用于在字符串位数小于m时补空格(右对齐)字符串位数大于m时忽略 如%5s,输出abc, abc(abc前面两个空格) .n用于控制字符串位数 长度大于n则仅输出前n位 字符串长度小于于n时忽略 如%.6s 需输出abcdefg 结果为abcdef 如%6f 需输出abc 结果为abc %-m.ns则为左对齐 |
%mc %-mc | m限制char的输出长度 当m>1时,在左方补m-1个空格 %-mc则为左对齐 |
%m.ne %-m.ne %m.nE %-m.nE | m用于控制指数长度,在QT中,指数部分占五位(如 e+001 ) 位数小于m时左方补空格 位数大于m时忽略 如printf(“%15.5e”,a); 设a为123.456789 结果为 1.23457e+002(三个空格) .n用于控制小数长度 小数部分长度大于n则四舍五入 小数部分长度小于于n则补0 如printf(“%15.5e”,a); 设a为123.456789 结果为 1.23457e+002(三个空格)%-m.ne %-m.nE则为左对齐 |
%*(整型)如%d %-(整型) | 在输出项中规定整型数据的宽度,少于限制补空格,大于忽略 如printf(“%d”,a,b); a=5 b=123 结果为 123(前面有两个空格) %-(整型) 左对齐 |
%0*(整型) | 在输出项中规定整型数据的宽度,少于限制补0,大于忽略 如printf(“%0*d”,a,b); a=5 b=123 结果为 00123 |
注意 | printf()中的运算是从右至左,而输出是从做左至右 如a=1,printf(“%d %d %d”,a++,a++,a++); 结果为3 2 1 |
函数 | 解释 |
---|---|
char *fgets(char *s, int n,PILE *stream); | 将输入的字符串存在s中,只保存n-1位,stream是输入流,一般用stdin 注意n一定不大于数组。 输入如果遇见换行符或文件结束符会提前停止输入,但换行符也会被保存 读入结束后,一个空字符(‘\0’)被保存在数组的结尾 char a[10]; fgets(a,10,stdin); printf("%s",a); 输入 A+B=C=de=f/e 输出 A+B=C=de |
函数 | 解释 |
---|---|
int putchar(int c); | 输出一个字符 |
函数 | 解释 |
---|---|
int getchar(void); | 输入一个字符并将其转化为整型 |
函数 | 解释 |
---|---|
int sprintf(char *s,“内容%d”,int c); | 除了是将输出的字符串保存到字符串*s以外 与printf()没什么区别 %d可以为其他格式说明符 |
函数 | 解释 |
---|---|
int sscanf(char *s,“内容%d”,int c); | 除了内容是从字符串*s输入的以外 其他和scanf没什么区别 |
cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。
在理解cin功能时,不得不提标准输入缓冲区。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符\n,这个换行符\n也会被存储在cin的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了123456这个字符串,然后敲一下回车键(\r)将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是7 ,而不是6。
cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。
#include <iostream>
using namespace std;
int main()
{
char a;
int b;
float c;
cin>> a >> b >> c;
cout << a << " " << b << " " << c << " " << endl;
system("pause");
return 0;
}
程序输入:d 56 67.777[回车]
使用cin读取键盘输入时,难免发生错误,一旦出错,cin将设置条件状态(condition state)。
条件状态标识符号 | 含义 |
---|---|
goodbit | 无错误 |
eofbit | 已到达文件尾 |
failbit | 非致命的输入/输出错误,可挽回 |
badbit | 致命的输入/输出错误,无法挽回 |
若在输入输出类里.需要加iOS::标识符号。与这些条件状态对应的就是设置、读取和判断条件状态的流对象的成员函数。
他们主要有:
s.eof():若流s的eofbit置位,则返回true;
s.fail():若流s的failbit置位,则返回true;
s.bad():若流s的badbit置位,则返回true;
s.good():若流s的goodbit置位,则返回true;
s.clear(flags):清空状态标志位,并将给定的标志位flags置为1,返回void。
s.setstate(flags):根据给定的flags条件状态标志位,将流s中对应的条件状态位置为1,返回void。
s.rdstate():返回流s的当前条件状态,返回值类型为strm::iostate。strm::iostate 机器相关的整形名,由各个iostream类定义,用于定义条件状态。
#include <iostream>
using namespace std;
int main()
{
char ch, str[20];
cin.getline(str, 5);
cout<<"flag1:"<<cin.good()<<endl; // 查看goodbit状态,即是否有异常
cin.clear(); // 清除错误标志
cout<<"flag1:"<<cin.good()<<endl; // 清除标志后再查看异常状态
cin>>ch;
cout<<"str:"<<str<<endl;
cout<<"ch :"<<ch<<endl;
system("pause");
return 0;
}
程序输入:12345[回车]
可以看出,因输入缓冲区未读取完造成输入异常,通过clear()可以清除输入流对象cin的异常状态。不影响后面的cin>>ch从输入缓冲区读取数据。因为cin.getline读取之后,输入缓冲区中残留的字符串是:5[换行],所以cin>>ch将5读取并存入ch,打印输入并输出5。
如果将clear()注释,cin>>ch;将读取失败,ch为空。
cin.clear()等同于cin.clear(ios::goodbit);因为cin.clear()的默认参数是ios::goodbit,所以不需显示传递,故而你最常看到的就是:
cin.clear()。
#include <iostream>
using namespace std;
int main()
{
char a;
char b;
a = cin.get();
cin.get(b);
cout << a << b << endl;
system("pause");
return 0;
}
程序输入:3456[回车]
Tips:空格与回车也算一个字符
istream& get ( char* s, streamsize n ) // 读取一行,指定读取n个数
istream& get ( char* s, size_t n, streamsize delim ) // 读取一行,指定读取n个数,且指定结束字符
空格不会终止输入,碰到换行符才会停止输入
#include <iostream>
using namespace std;
int main()
{
char array[20] = { NULL };
cin.get(array, 20);
cout << array ;
system("pause");
return 0;
}
程序输入:3456 789[回车]
#include <iostream>
using namespace std;
int main()
{
char array[20] = { NULL };
cin.get(array,20,'b');
cout << array ;
system("pause");
return 0;
}
程序输入:adgd yuibklohg[回车]
istream& getline(char* s, streamsize count); // 默认以换行符结束
istream& getline(char* s, streamsize count, char delim); // 读取一行,指定读取n个数,且指定结束字符
使用方法和cin.get
相同
cin.getline
与cin.get
的区别是,cin.getline
不会将结束符或者换行符残留在输入缓冲区中。
从上文中可以看出,上一次的输入操作很有可能是输入缓冲区中残留数据,影响下一次的输入。
那么如何解决这个问题呢?
自然而然,我们想到了在进行输入时,对输入缓冲区进行清空和状态条件的复位。条件状态的复位使用clear(),清空输入缓冲区应该使用:
函数原型:istream &ignore( streamsize num=1, int delim=EOF );
函数作用:跳过输入流中n个字符,或在遇到指定的终止字符时提前结束(此时跳过包括终止字符在内的若干字符)。
使用示例如下:
#include <iostream>
using namespace std;
int main()
{
char str1[20]={NULL},str2[20]={NULL};
cin.getline(str1,5);
cin.clear(); // 清除错误标志
cin.ignore(numeric_limits<std::streamsize>::max(),'\n'); //清除缓冲区的当前行
cin.getline(str2,20);
cout<<"str1:"<<str1<<endl;
cout<<"str2:"<<str2<<endl;
system("pause");
return 0;
}
程序输入:12345[回车]success[回车]
注意:
(1)程序中使用cin.ignore清空了输入缓冲区的当前行,使上次的输入残留下的数据没有影响到下一次的输入,这就是ignore()函数的主要作用。其中,numeric_limits::max()不过是头文件定义的流使用的最大值,你也可以用一个足够大的整数代替它。
如果想清空输入缓冲区,去掉换行符,使用:
cin.ignore(numeric_limits< std::streamsize>::max()); 清除cin里所有内容。
(2)cin.ignore();当输入缓冲区没有数据时,也会阻塞等待数据的到来。
图片内程序有些不清楚,下面重新打了一遍
char a[13]="4cabc56c78c9";
char *c=strtok(a,"ab");
//搜索s2中的第一个字符,将s1中的该字符覆盖为'\0',strtok函数保存标号后‘\0’的地址,返回标号第一个字符地址。
printf("*%s*\n",c);
c=strtok(nullptr,"z");
//返回搜索起始字符地址,保存nullptr。
printf("*%s*\n",c);
c=strtok(nullptr,"c");
//当strtok保存的本来就是nullptr,返回nullptr。
printf("*%s*\n",c);
for(int n=0;n<13;n++)
printf("%c",a[n]);
函数exit强制终止程序的运行。
在程序结束时(包括被exit()打断的)按照相反的顺序运行函数
#inc2024.01.22)
# 一、lude<stdio.h>
#include<stdlib.h>
void a(void)
{
printf("%s\n","this is a;");
}
void b(void)
{
printf("%s\n","this is b;");
}
void c(void)
{
printf("%s\n","this is c;");
}
int main()
{
printf("%s\n","this is main first;");
//在程序结束时按照相反的顺序运行函数
atexit(a);
atexit(b);
atexit(c);
printf("%s\n","this is main;");
exit(EXIT_SUCCESS);
printf("%s\n","this is main 2;");
}
结果为
this is main first;
this is main;
this is c;
this is b;
this is a;
参考资料:
(超全,超经典)字符串函数与易错点
(学习日记)2024.01.20:通用工具库stdlib.h里好玩的函数
参考资料:
(超全,超经典)字符串函数与易错点
Windows.h是一个重要的头文件,它包含了其他Windows头文件,这些头文件的某些也包含了其他头文件。
这些头文件中最重要的和最基本的是:
这些头文件定义了Windows的所有资料型态、函数调用、资料结构和常数识别字,它们是Windows文件中的一个重要部分。
寻找窗口 类名称 标题 spy++获取 返回的窗口的句柄
获取当前的活动窗口
设置当前的活动窗口
模拟按键
(其中
ESC键VK_ESCAPE (27)
回车键:VK_RETURN (13)
TAB键:VK_TAB (9)
Caps Lock键:VK_CAPITAL (20)
Shift键:VK_SHIFT (16)
Ctrl键:VK_CONTROL (17)
Alt键:VK_MENU (18)
空格键:VK_SPACE (32)
退格键:VK_BACK (8)
左徽标键:VK_LWIN (91)
右徽标键:VK_RWIN (92)
鼠标右键快捷键:VK_APPS (93)
Insert键:VK_INSERT (45)
Home键:VK_HOME (36)
Page Up:VK_PRIOR (33)
PageDown:VK_NEXT (34)
End键:VK_END (35)
Delete键:VK_DELETE (46)
方向键(←):VK_LEFT (37)
方向键(↑):VK_UP (38)
方向键(→):VK_RIGHT (39)
方向键(↓):VK_DOWN (40)
F1键:VK_F1 (112)
F2键:VK_F2 (113)
F3键:VK_F3 (114)
F4键:VK_F4 (115)
F5键:VK_F5 (116)
F6键:VK_F6 (117)
F7键:VK_F7 (118)
F8键:VK_F8 (119)
F9键:VK_F9 (120)
F10键:VK_F10 (121)
F11键:VK_F11 (122)
F12键:VK_F12 (123)
Num Lock键:VK_NUMLOCK (144)
小键盘0:VK_NUMPAD0 (96)
小键盘1:VK_NUMPAD1 (97)
小键盘2:VK_NUMPAD2 (98)
小键盘3:VK_NUMPAD3 (99)
小键盘4:VK_NUMPAD4 (100)
小键盘5:VK_NUMPAD5 (101)
小键盘6:VK_NUMPAD6 (102)
小键盘7:VK_NUMPAD7 (103)
小键盘8:VK_NUMPAD8 (104)
小键盘9:VK_NUMPAD9 (105)
小键盘。:VK_DECIMAL (110)
小键盘*:VK_MULTIPLY (106)
小键盘+:VK_ADD (107)
小键盘-:VK_SUBTRACT (109)
小键盘/:VK_DIVIDE (111)
Pause Break键:VK_PAUSE (19)
Scroll Lock 键 :VK_SCROLL(145)
)
参考资料:
有意思的函数