刷codeup及PAT的知识漏洞整理

1、C++动态二维数组声明:

int** a2 = new int*[rows];

for(int i=0;i<rows;i++)

 a2[i] = new int[columns];

2、scanf遇到空格会结束。(%s也是)

但最后的空格、换行等会留在缓冲区。

 

3、qsort使用stdlib.h,其中的sizeof()中填数组类型。

qsort(数组名,元素个数,元素类型所占空间,排序函数);

Cmp函数,返回值为负则不交换。

int cmp(const void*,const void *)

{

}

c++的sort函数,cmp则为bool型,且返回值为正则不交换。(若要对结构体进行排序,最好在形参位置加上引用,否则调用时会复制结构体,开销较大)

 

4、无特殊说明,默认每行输出后都带\n。

有多组数据,每组后面要加\n分开。

 

5、三者都是从标准输入流stdio (标准输入设备,一般指向键盘)中读取内容。

scanf输入字符串的时候不会接收Space空格,回车Enter,Tab键;均认为输入结束。

gets能接收空格键,回车键,Tab键;回车则认为输入结束

getchar只能接受一个字符,遇到回车结束输入,可接受回车键。常用来吸收回车符。

 

6、获得字符串匹配位置:

Strstr()获得指针后,减去原指针。

 

7、strcpy函数,第一个参数char *des,不能是一个未分配空间的指针(如char *p)。

scanf输入%s时,也不能是一个未分配空间的指针。

 

8、c语言和C++在使用结构体的时候,定义变量方式不同:c++可以当做类名直接定义,而C语言需要在定义时,前面加上struct关键字(若使用typedef则不需要):

struct Book book;

 

9、不同编译器,对p = (i++) + (i++)的执行结果不同,vc6中p是两个i的原值的和;而dev c++中,第二个i是已经自增过的i。

为保险起见,不要出现这种同一行语句中出现同一变量的多次自增自减操作。

 

10、c语言定义指针数组,若此数组是全局变量,则默认初始化为空指针,若是局部变量,则为随机值。

 

11、c语言结构体定义方法:

typedef struct node
{
    int data;
    struct node* lchild;
    struct node* rchild;
}Node,*Tree; 

这样定义,使用时不需再加struct关键字,且需要定义结构体指针时也不需加*符号(如直接Tree root; 定义的root是一个指针)。

注:不可以在结构体结束处直接Node[const],需要另外定义。(C++可以这样)

 

12、c语言二叉树建树,若是边建树边新建结点,则函数形参需要是双指针,并且在传参时,需要传引用:

void insert(Node** root,int data)

insert(&root,temp);

若是c++,则可以直接定义形参为指针的引用:

void insert(Node* & root,int data)

insert(root,temp);

 

13、c/c++给数组初始化时,规则为,数组初始化列表中的元素个数小于指定的数组长度时,不足的元素补以默认值:

int a[5] = { 1 }; //标准C/C++只有第一个元素赋值为1,其他都为0.

 

14、c语言memset,数组置零:

memset(a,0,n*sizeof(a));

其中n是数组长度,若是二维数组,则再乘n。

 

15、c++ vector迭代器用法:

for(vector<int>::iterator iter = a.begin();iter != a.end(); ++iter)

{

     cout << *iter << endl;

}

利用iterator寻找相同的vector元素 :

it = find(v1.begin() , v1.end() , v2[i]);

if(it != v1.end())    //it与v1.end()相等说明没找到

...

 

16、求解树的LCA以及路径合并:

void LCAmerge(vector<int> path1,vector<int> path2,int target)
{
    vector<int> path;
    vector<int>::iterator it;
    for(int i = path1.size()-1;i>=0;i--)
    {
        it = find(path2.begin(),path2.end(),path1[i]);
        if(it != path2.end())
        {
            for(int j = path1.size()-1;j>i;j--)
            {
                path.push_back(path1[j]);
            }
            for(it;it != path2.end();it++)
            {
                path.push_back(*it);
            }
            break;
        }
    }

    for(int p = 0;p<path.size();p++)
    {
        printf("%d ",path[p]);
    }
    printf("%d\n",target);
    return;
}

17、二维数组初始化为非0值:

#define MAXN 1000
int G[MAXN][MAXN];
fill(G[0],G[0] + MAXN*MAXN,10000);

18、若使用int *p;的方式定义数组,则传参时是按照指针来处理;解决办法是传引用。否则想要获取数组长度时,sizeof(p)/sizeof(int)永远是1。

 

19、整数转char字符串:使用sprintf,第一个参数是要存入的char数组,第二个参数是格式(参考printf),第三个参数是需要转换的原始数据。

sprintf(str , "%d" , N);

 

20、c++11以下的标准不允许map直接使用大括号初始化,只能用insert或一个一个初始化。

map<int , char *> m;

m[1] = "one";

 

21、输出浮点数保留一位小数:

printf("%.1f",x);

 

22、太可怕了。qsort在处理结构体时有时会出玄学错误,里面的成员变量在排序后会乱码。保险起见还是用sort吧!

 

23、不要用fflush(stdio)来清除输入缓存,它不是标准函数。写题时想要吃掉\n,直接用getchar()即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值