算法第一次作业总结

终于完成了算法课的第一次作业,自从大一做过C语言课设之后就没有用过C了,这次突然捡起来,而且还是在linux上编,一开始还是不太适应的,毕竟不是大牛程序员嘛。
下面是我第一次作业的经验总结:

1.uint32_t和uint64_t类型:因为这次作业需要用到的是大数相乘和相除,所以大的整形数一定要用到了。老师推荐我们用的是这两个类型,而不是long unsigned和long long unsigned,原因是uint32_t和uint64_t这两种类型的大小始终是不变的,32位一直就是32位,64位一直就是64位。虽然我还是不太知道这样有什么好处,但是老师说的应该是对的。
另外这两种类型的打印符还是比较奇怪的,分别是%“PRIu32"和%llu,不知道为什么还不是统一形式的打印符,其中“PRIu32"需要include "inttypes.h"。
例子
uint32_t i=12345;
uint63_t j=12345123;
printf("i=%"PRIu32",j=%llu",i,j);


2.malloc和calloc:之前只是知道这两个函数,但是从来没有用过,这次之后觉得还真的是少不了的两个函数。他们俩的区别在于,仅限于我了解的,malloc是分配一个指定大小的连续空间,而calloc可以分配多个。而且malloc分配的空间不会自动清零,calloc可以自动清零,所以对我来说,还是calloc比较好用,就因为不能自动清零这个事,然后困惑了好久。对了,使用过变量之后一定要free()一下,不要有内存泄漏。

3.关于字符串的可读可写问题:如果我定义一个字符串采用指针的形式,例如
 
char* s="";

则这个s会被分配在只读空间内,如果对s进行写操作的话,运行时会出现段错误。
而如果定义为数组的形式就既可读又可写了。但是这样的不便之处在于无法实现动态长度的字符串,不过不用担心,只要用calloc就可以啦。

4.解决linux下没有itoa函数的问题:一开始用itoa发现不行,自己就不知道怎么办了,上网查了一下,原来linux里没有这个函数,但是用snprintf或者sprintf可以实现。
在我程序中的一个例子,将整形数134224转换成字符串
uint32_t i=134224;
char* s;
s=(char*)calloc((sizeof(char),ilength(i));
snprintf(s,ilength(i)+1,"%"PRIu32",i);

其中ilength()函数是我自己写的一个计算整形数位数的函数。

第一次作业的总结大概就是这么多,以后的编程方面的东西还要多多总结才是。

你可能感兴趣的:(算法)