标签归档:C语言

将01字符串转换成二进制输出到文件

今天有个学弟问我,他已经实现了哈夫曼编码,把一个字符转换成了01字符串,比如’a’=>”111″,现在要对一篇文章用哈弗曼编码压缩,也就是把每个字符都转换成01串,然后以真正的二进制形式输出到文件中,也就是说,“111”不再是三个字节(byte),而是三个二进制位(bit)。想到我上学期做软设I的时候动态哈夫曼编码最后也只是输出了01字符串,没有输出成真正的二进制,于是就顺手写了一段转换程序,算是给那个小项目做个了结吧。

继续阅读

一道关于指针的Google笔试题

[题目]


下面说法正确的是[]
A.函数foo()不能改变p指向的字符串内容
B.函数foo()不能使指针p指向malloc生成的地址
C.函数foo()可以使p指向新的字符串常量
D.函数foo()可以把p赋值为 NULL.

简单地说,p是一个字符串。

实际上,p是一个普通的指针(可以修改指向),这个指针指向一个不可改变的字符(i.e. 这个指针本身的值是一个字符在内存中存储的地址),这个字符是常字符串”hello”的第一个字符。

const char **pp是一个指针,这个指针指向一个指针’,指针’就是像上述的p那样的指针。函数foo仅接受一个参数,这个参数的值是pp要指向的那个指针自己在内存中的地址(不是那个指针指向的地址),正是由于这个原因,第二句写的是foo(&p),将指针p自己的地址传了进去。此时pp的值就是p的地址,*pp就是p的值,也就是p指向的常字符的地址(或者说常字符串的首地址,因为char*既可以指向字符”又可以指向字符串””,不管指向什么,它都只是存一个字符在内存中的地址,如果指向字符串,那么它存第一个字符的地址,后面的字符是通过指针的加法运算来访问的)。下面依次分析每个选项:

A. 可以通过**pp来读取p指向的字符的值,但是p是指向const char,所以只能读取,不能改变内容,A正确。
B. malloc是从内存中申请空间的函数,它返回申请到的空间的首地址(起始地址)。根据上面的分析,通过为*pp赋值,即可改变p的值,也就是使p的指向。另外,“声明const char* p”的意思不是“p只能指向字符串常量”,而是“不能用p来修改那个字符串”,用普通的char*再指向那个字符串,还是可以修改那个字符串的。换句话说,字符串本身是不带“只读”属性的,是不是只读,在于用户声明的调用方式。例:

又例:

所以foo()能够使p指向malloc生成的地址。B错误。

C. p是指向字符串常量的指针,const修饰的是char,不是char*,所以“只读”的是p指向的那个字符串,而不是p本身。因此,p的指向是可以改变的,可以令它指向其他字符串常量。给*pp赋值即可。C正确。
D. 根据以上分析,可以将p赋值为null(让p指向空)。D正确。

C语言随机数趣味小练习——猜数

今天下午信息课闲来无事,下载了code::blocks(刚知道的,一个很好用的IDE),编程序玩。想起自己C语言里的随机数还不会用,于是就在网上查资料查到了两句代码。一时兴起,编了这么一个猜数的程序。

先说随机数的代码(简易版)。

 

继续阅读