感觉很难起标题,想表达的意思是:因为比较笨,很多想不到的技巧就在这里积累一下。

差不多就是这么个意思。以下就开始正文部分啦~

###关于末尾不要的逗号
之前写程序的时候一直苦恼这个问题,怎么样使打印一列数字的末尾不要逗号。没想到《Expert C Programming》里专门讲到了解决的办法。看下面这个函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "stdio.h"
generate_initializer(char a){
static char separator = ' ';
printf("%c%c", separator, a);
separator = ',';
}
int main(){
char a[10] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
int i;
for(i = 0; i < 10; i++)
generate_initializer(a[i]);
return 0;
}

我和我的小伙伴们都惊呆了!虽然这样做也有缺点,就是必须首先打一个空格,但是比起最后的那个逗号,问题也不大嘛

ps 如果实在不想要那个空格,也不是没有办法,虽然直接去掉空格写成’’是会报错的,但是写成’\0’就完全木有问题了!

###不翼而飞的空间
说起来好像是在变魔术,刚开始写程序的时候,会遇到在某个函数中申请的数组作为返回值返回之后,就无法访问了的情况。当时还不知道什么是堆栈,什么是生存期。当然这一点得感谢编译原理这门课,这是后话。后来明白了这些,也就知道直接malloc一块空间就不会被自动回收掉了。今天在《Expert C Programming》里看到了很多解决方法,十分激动,于是记录下来。

1 返回一个指向字符串常量的指针
说起来好像很神奇,其实就是直接return “今天很开心啊!”;

2 使用全局声明的数组
也就是说直接在全局声明一个数组,在函数中赋值。由于是全局的,当然空间不会被回收。不过总是用全局变量不是什么好习惯的说。

3 使用静态数组

1
2
3
4
5
char *func(){
static char buffer[20];
...
return buffer;
}

关于static的原理在这里就不多说了。

4 显示分配一些内存
此乃一直在用的方法。为避免内存泄露,用完之后记得回收。

1
2
3
4
5
char *func(){
char *buffer = malloc(120);
...
return buffer;
}

5 要求调用者分配内存来保存函数的返回值
这个方法是最好的解决方案了。因为让调用者指定了缓冲区的大小,所以安全性比较好。

1
2
3
4
void func(char *result, int size){
...
str
}