C语言数据结构的一些高级使用
许多人都是从C语言开始学编程的,想起C语言肯定觉得再熟悉不过了;但你真吃透了这个语言吗?下面我们通过下面两个问题来看看:
为讨论方便,我们假设所有的输入都是合法的。
1。给定一组数据,这组数据是由若干个整型,浮点型和字符型组成的,每个位个具体是什么数据类型要求用户输入决定。要求实现一个函数:
输入:数据的总长L
输出:以相应数据类型的格式打印出数据,即如果是浮点型就打印成1.2e3的格式,如果是字符型就打印成abc的格式
通过用户输入的数据类型打印出数据。
[第一眼的印象]:声明三个变量,A,B,C分别是整型,浮点型和字符型,然后再根据输入强制类型转换。
[再想想]:一组不知道类型只知道长度的数据,你取了一个数据之后怎么取第二个?
[第二眼的印象]:根据类型的大小向后加多少个字节就行了。
[再想想]:如果我不愿意查手册,或者这种类型所占的字节数在不同机器上不同怎么办?
2。设计一个控制台程序,如果程序启动时带一个参数(此参数是一个文件名),则将结果输出到另一个文件;如果程序启动时没有带参数,从键盘获得输入,在显示器上给出输出。
[第一眼的印象]:带个判断写个两个小函数,这还不简单。
[再想想]:有没有更简单的方法。可能不用两个函数的规模呢。
对于第一个问题比较好的方法是使用是指针的联合:
union value
{
int* d;
float* f;
char* c;
}v;
令v.d(或v.f,或v.c)指向数据块的首地址。
如果用户输入代表整型: printf("%d", *v.d);
如果用户输入代表浮点型: printf("%f", *v.f);
如果用户输入代表字符型: printf("%c", *v.c);
这样所用的存储空间最少,实际上只使用了一个指针类型的存储空间。那如何取得下一个数据的位置呢?方便得很
如果用户输入代表整型: v.d++;
如果用户输入代表浮点型: v.f++;
如果用户输入代表字符型: v.c++;
如果把上面的语句写得更简单一点,就会变成下面的样子:
如果用户输入代表整型: printf("%d", *(v.d++));
如果用户输入代表浮点型: printf("%f", *(v.f++));
如果用户输入代表字符型: printf("%c", *(v.c++));
看看上面的句子,大部分是相同的,又这么规范,有没有办法让我写得更少一点呢?使用宏。
#define PrintOut(x) printf("%x", *(v.x++))
那整个代码段会变成:
如果用户输入代表整型: PrintOut(d);
如果用户输入代表浮点型: PrintOut(f);
如果用户输入代表字符型: PrintOut(c);
对于第二个问题,其实只要明白操作系统里的一个基础原理就行了。现代操作系统中认为显示输出是向一个称为stdout的文件进行写入,而键盘输入则是向stdin文件进行写入。这样一来,我们就把键盘和显示器也看成了文件,两个函数的问题就可以化成一个函数来解决了。
我们使用两个文件指针
FILE* cmdFilep //输入数据文件指针
FILE* outFilep //输出数据文件指针
下面的代码是根据用户是否输入了输入文件名而决定上面的两个文件指针的指向。
cmdFilep = strlen(szFileName) ? fopen(szFileName, "r") : stdin;
outFilep = strlen(szFileName) ? stdin : stdout;
请注意:如果你不希望在控制台上获得输出,直接将输出数据输出到stdin(标准输入)上即可。 |