2.声明和初始化
2.1我如何决定使用那种整数类型?
2.2位机上的位类型是什么样的?
2.3怎样定义和声明全局变量和函数最好?
2.4extern在函数声明中是什么意思?
2.5关键字auto到底有什么用途?
2.6我似乎不能成功定义一个链表。我试过typedef struct{char*item;NODEPTR next;}*NODEPTR;但是编译器报了错误信息。难道在C语言中一个结构不能包含指向自己的指针吗?
2.7怎样建立和理解非常复杂的声明?例如定义一个包含N个指向返回指向字符的指针的函数的指针的数组?
2.8函数只定义了一次,调用了一次,但编译器提示非法重定义了。
2.9main()的正确定义是什么?void main()正确吗?
2.10对于没有初始化的变量的初始值可以作怎样的假定?如果一个全局变量初始值为``零
2.11代码int f(){char a[]="Hello,world!";}不能编译。
2.12这样的初始化有什么问题?char*p=malloc(10);编译器提示``非法初始式"云云。
2.13以下的初始化有什么区别?char a[]="string literal";char*p="string literal";当我向p[i]赋值的时候,我的程序崩溃了。
2.14我总算弄清除函数指针的声明方法了,但怎样才能初始化呢?
3.结构、联合和枚举
3.1声明struct x1{...};和typedef struct{...}x2;有什么不同?
3.2为什么struct x{...};x thestruct;不对?
3.3一个结构可以包含指向自己的指针吗?
3.4在C语言中实现抽象数据类型什么方法最好?
3.5在C中是否有模拟继承等面向对象程序设计特性的好方法?
3.6我遇到这样声明结构的代码:struct name{int namelen;char namestr[1];};然后又使用一些内存分配技巧使namestr数组用起来好像有多个元素。这样合法和可移植吗?
3.7是否有自动比较结构的方法?
3.8如何向接受结构参数的函数传入常数值?
3.9怎样从/向数据文件读/写结构?
3.10我的编译器在结构中留下了空洞,这导致空间浪费而且无法与外部数据文件进行"二进制"读写。能否关掉填充,或者控制结构域的对齐方式?
3.11为什么sizeof返回的值大于结构的期望值,是不是尾部有填充?
3.12如何确定域在结构中的字节偏移?
3.13怎样在运行时用名字访问结构中的域?
3.14程序运行正确,但退出时却``core dump''了,怎么回事?
3.15可以初始化一个联合吗?3.16枚举和一组预处理的#define有什么不同?
3.17有什么容易的显示枚举值符号的方法?
4.表达式
4.1为什么这样的代码:a[i]=i++;不能工作?
4.2使用我的编译器,下面的代码int i=7;printf("%d\\n
4.3对于代码int i=3;i=i++;不同编译器给出不同的结果,有的为3,有的为4,哪个是正确的?
4.4这是个巧妙的表达式:a^=b^=a^=b它不需要临时变量就可以交换a和b的值。
4.5我可否用括号来强制执行我所需要的计算顺序?
4.6可是&&和||运算符呢?我看到过类似while((c=getchar())!=EOF&&c!='\\n')的代码……
4.7我怎样才能理解复杂表达式?``序列点"是什么?
4.8那么,对于a[i]=i++;我们不知道a[]的哪一个分量会被改写,但i的确会增加1,对吗?
4.9++i和i++有什么区别?
4.10如果我不使用表达式的值,我应该用++i或i++来自增一个变量吗?
4.11为什么如下的代码int a=100,b=100;long int c=a*b;不能工作?4.12我需要根据条件把一个复杂的表达式赋值给两个变量中的一个。可以用下边这样的代码吗?((condition)?a:b)=complicated_expression;
5.指针
5.1我想声明一个指针并为它分配一些空间,但却不行。这些代码有什么问题?char*p;*p=malloc(10);
5.2*p++自增p还是p所指向的变量?
5.3我有一个char*型指针正巧指向一些int型变量,我想跳过它们。为什么如下的代码((int*)p)++;不行?
5.4我有个函数,它应该接受并初始化一个指针void f(int*ip){static int dummy=5;ip=&dummy;}但是当我如下调用时:int*ip;f(ip);调用者的指针却没有任何变化。
5.5我能否用void**指针作为参数,使函数按引用接受一般指针?
5.6我有一个函数extern int f(int*);它接受指向int型的指针。我怎样用引用方式传入一个常数?下面这样的调用f(&5);似乎不行。
5.7C有``按引用传递"吗?
5.8我看到了用指针调用函数的不同语法形式。到底怎么回事?
5.9我怎样把一个int变量转换为char*型?我试了类型转换,但是不行。
6.空(null)指针
6.1臭名昭著的空指针到底是什么?
6.2怎样在程序里获得一个空指针?
6.3用缩写的指针比较``if(p)"检查空指针是否可靠?如果空指针的内部表达不是0会怎么样?
6.4NULL是什么,它是怎么定义的?
6.5在使用非全零作为空指针内部表达的机器上,NULL是如何定义的?
6.6如果NULL定义成#define NULL((char*)0)难道不就可以向函数传入不加转换的NULL了吗?
6.7如果NULL和0作为空指针常数是等价的,那我到底该用哪一个呢?
6.8但是如果NULL的值改变了,比如在使用非零内部空指针的机器上,难道用NULL(而不是0)不是更好吗?
6.9用预定义宏#define Nullptr(type)(type*)0帮助创建正确类型的空指针。6.10这有点奇怪。NULL可以确保是0,但空(null)指针却不一定?
6.11为什么有那么多关于空指针的疑惑?为什么这些问题如此经常地出现?6.12我很困惑。我就是不能理解这些空指针一类的东西。
6.13考虑到有关空指针的所有这些困惑,难道把要求它们内部表达都必须为0不是更简单吗?
6.14说真的,真有机器用非零空指针吗,或者不同类型用不同的表达?
6.15运行时的``空指针赋值"错误是什么意思?
7.数组和指针
7.1我在一个源文件中定义了char a[6],在另一个中声明了extern char*a。为什么不行?
7.2可是我听说char a[]和char*a是一样的。
7.3那么,在C语言中``指针和数组等价"到底是什么意思?
7.4那么为什么作为函数形参的数组和指针申明可以互换呢?
7.5如果你不能给它赋值,那么数组如何能成为左值呢?
7.6现实地讲,数组和指针地区别是什么?
7.7有人跟我讲,数组不过是常指针。
7.8我遇到一些``搞笑"的代码,包含5["abcdef"]这样的``表达式"。这为什么是合法的C表达式呢?
7.9既然数组引用会蜕化为指针,如果arr是数组,那么arr和&arr又有什么区别呢?
7.10我如何声明一个数组指针?
7.11我如何在运行期设定数组的大小?我怎样才能避免固定大小的数组?7.12我如何声明大小和传入的数组一样的局部数组?
7.13我该如何动态分配数组?
7.14有个灵巧的窍门:如果我这样写int realarray[10];int*array=&realarray[-1];我就可以把``array"当作下标从1开始的数组。
7.15当我向一个接受指针的指针的函数传入二维数组的时候,编译器报错了。
7.16我怎样编写接受编译时宽度未知的二维数组的函数?
7.17我怎样在函数参数传递时混用静态和动态数组?
7.18当数组是函数的参数时,为什么sizeof不能正确报告数组的大小?
8.内存分配8.1为什么这段代码不行?char*answer;printf("Type something:\\n");gets(answer);printf("You typed\\"% s\\"\\n
8.2我的strcat()不行.我试了char*s1="Hello,";char*s2="world!";char*s3=strcat(s1,s2);但是我得到了奇怪的结果。
8.3但是strcat的手册页说它接受两个char*型参数。我怎么知道(空间)分配的事情呢?
8.4我刚才试了这样的代码char*p;strcpy(p,"abc");而它运行正常?怎么回事?为什么它没有崩溃?
8.5一个指针变量分配多少内存?
8.6我有个函数,本该返回一个字符串,但当它返回调用者的时候,返回串却是垃圾信息。
8.7那么返回字符串或其它集合的争取方法是什么呢?
8.8为什么在调用malloc()时,我得到``警告:整数赋向指针需要类型转换"?8.9为什么有些代码小心地把malloc返回的值转换为分配的指针类型。
8.10在调用malloc()的时候,错误``不能把void*转换为int*"是什么意思?
8.11我见到了这样的代码char*p=malloc(strlen(s)+1);strcpy(p,s);难道不应该是malloc((strlen(s)+1)*sizeof(char))?
8.12我如何动态分配数组?
8.13我听说有的操作系统程序使用的时候才真正分配malloc申请的内存。这合法吗?
8.14我用一行这样的代码分配一个巨大的数组,用于数字运算:double*array=malloc(300*300*sizeof(double));malloc()并没有返回null,但是程序运行得有些奇怪,好像改写了某些内存,或者malloc()并没有分配我申请的那么多内存,云云。
8.15我的PC有8兆内存。为什么我只能分配0K左右的内存?
8.16我的程序总是崩溃,显然在malloc内部的某个地方。但是我看不出哪里有问题。是malloc()有bug吗?
8.17动态分配的内存一旦释放之后你就不能再使用,是吧?
8.18为什么在调用free()之后指针没有变空?使用(赋值,比较)释放之后的指针有多么不安全?
8.19当我malloc()为一个函数的局部指针分配内存时,我还需要用free()明确的释放吗?
8.20我在分配一些结构,它们包含指向其它动态分配的对象的指针。我在释放结构的时候,还需要释放每一个下级指针吗?
8.21我必须在程序退出之前释放分配的所有内存吗?
8.22我有个程序分配了大量的内存,然后又释放了。但是从操作系统看,内存的占用率却并没有回去。
8.23free()怎么知道有多少字节需要释放?
8.24那么我能否查询malloc包,可分配的最大块是多大?
8.25向realloc()的第一个参数传入空指针合法吗?你为什么要这样做?
8.26calloc()和malloc()有什么区别?利用calloc的零填充功能安全吗?free()可以释放calloc()分配的内存吗,还是需要一个cfree()?
8.27alloca()是什么?为什么不提倡使用它?
9.字符和字符串
9.1为什么strcat(string,'!');不行?
9.2我在检查一个字符串是否跟某个值匹配。为什么这样不行?char*string;...if(string=="value"){/*string matches"value"*/...}
9.3如果我可以写char a[]="Hello,world!";为什么我不能写char a[14];a="Hello,world!";
9.4我怎么得到对应字符的数字(字符集)值,或者相反?
9.5我认为我的编译器有问题:我注意到sizeof('a')是2而不是1(即,不是sizeof(char))。
10.布尔表达式和变量
10.1C语言中布尔值的候选类型是什么?为什么它不是一个标准类型?我应该用#define或enum定义true和false值吗?
10.2因为在C语言中所有的非零值都被看作``真
10.3当p是指针时,if(p)是合法的表达式吗?
11.C预处理器
11.1这些机巧的预处理宏:#define begin{#define end}你觉得怎么样?11.2怎么写一个一般用途的宏交换两个值?
11.3书写多语句宏的最好方法是什么?
11.4我第一次把一个程序分成多个源文件,我不知道该把什么放到.c文件,把什么放到.h文件。(``.h"到底是什么意思?)
11.5一个头文件可以包含另一头文件吗?
11.6#include<>和#include有什么区别?
11.7完整的头文件搜索规则是怎样的?
11.8我在文件的第一个声明就遇到奇怪的语法错误,但是看上去没什么问题。
11.9我包含了我使用的库函数的正确头文件,可是连接器还是说它没有定义。
11.10我在编译一个程序,看起来我好像缺少需要的一个或多个头文件。谁能发给我一份?
11.11我怎样构造比较字符串的#if预处理表达式?
11.12sizeof操作符可以用于#if预编译指令中吗?
11.13我可以在#include行里使用#ifdef来定义两个不同的东西吗?
11.14对typdef的类型定义有没有类似#ifdef的东西?
11.15我如何用#if表达式来判断机器是高字节在前还是低字节在前?
11.16我得到了一些代码,里边有太多的#ifdef。我不想使用预处理器把所有的#include和#ifdef都扩展开,有什么办法只保留一种条件的代码呢?
11.17如何列出所有的预定义标识符?
11.18我有些旧代码,试图用这样的宏来构造标识符#define Paste(a,b)a/**/b但是现在不行了。
11.19为什么宏#define TRACE(n)printf("TRACE:%d\\n
11.20使用#操作符时,我在字符串常量内使用宏参数有问题。
11.21我想用预处理做某件事情,但却不知道如何下手。
11.22怎样写参数个数可变的宏?
12.ANSI/ISO标准C
12.1什么是``ANSI C标准"?
12.2我如何得到一份标准的副本?
12.3我在哪里可以找到标准的更新?
12.4很多ANSI编译器在遇到以下代码时都会警告类型不匹配。extern int func(float);int func(x)float x;{...
12.5能否混用旧式的和新型的函数语法?
12.6为什么声明extern int f(struct x*p);报出了一个奇怪的警告信息``结构x在参数列表中声明"?
12.7我不明白为什么我不能象这样在初始化和数组维度中使用常量:const int n=5;int a[n];
12.8既然不能修改字符串常量,为什么不把它们定义为字符常量的数组?
12.9``const char*p"和``char*const p"有何区别?
12.10为什么我不能向接受const char**的函数传入char**?
12.11怎样正确声明main()?
12.12我能否把main()定义为void,以避免扰人的``main无返回值"警告?12.13可main()的第三个参数envp是怎么回事?
12.14我觉得把main()声明为void不会失败,因为我调用了exit()而不是return,况且我的操作系统也忽略了程序的退出/返回状态。
12.15那么到底会出什么问题?真的有什么系统不支持void main()吗?
12.16我一直用的那本书《熟练傻瓜C语言》总是使用void main()。
12.17从main()中,exit(status)和返回同样的status真的等价吗?
12.18我试图用ANSI``字符串化"预处理操作符#向信息中插入符号常量的值,但它字符串化的总是宏的名字而不是它的值。
12.19警告信息``warning:macro replacement within a string literal"是什么意思?
12.20在我用#ifdef去掉的代码里出现了奇怪的语法错误。
12.21#pragma是什么,有什么用?
12.22``#pragma once"是什么意思?我在一些头文件中看到了它。
12.23a[3]="abc";合法吗?它是什么意思?
12.24为什么我不能对void*指针进行运算?
12.25memcpy()和memmove()有什么区别?
12.26malloc(0)有什么用?返回一个控指针还是指向0字节的指针?
12.27为什么ANSI标准规定了外部标示符的长度和大小写?
12.28我的编译对最简单的测试程序报出了一大堆的语法错误。
12.29为什么有些ASNI/ISO标准库函数未定义?我明明使用的就是ANSI编译
器。
12.30谁有把旧的C程序转化为ANSI C或相反的工具,或者自动生成原型的工具?
12.31为什么声称兼容ANSI的Frobozz Magic C编译器不能编译这些代码?我知道这些代码是ANSI的,因为gcc可以编译。
12.32人们好像有些在意实现定义(implementation-defin-ed)、未明确(unspecified)和无定义(undefined)行为的区别。它们的区别到底在哪里?
12.33一个程序的``合法
12.34我很吃惊,ANSI标准竟然有那么多没有定义的东西。标准的唯一任务不就是让这些东西标准化吗?
12.35有人说i=i++的行为是未定义的,但是我刚在一个兼容ANSI的编译器上测试,得到了我希望的结果。
13.标准输入输出库
13.1这样的代码有什么问题?char c;while((c=getchar())!=EOF)...
13.2我有个读取直到EOF的简单程序,但是我如何才能在键盘上输入那个``EOF"呢?
13.3为什么这些代码while(!feof(infp)){fgets(buf,MAXLINE,infp);fputs(buf,outfp);}把最后一行复制了两遍?
13.4我的程序的屏幕提示和中间输出有时显示在屏幕上,尤其是当我用管道向另一个程序输出的时候。
13.5我怎样不等待回车键一次输入一个字符?
13.6我如何在printf的格式串中输出一个'%'?我试过\\%,但是不行。
13.7有人告诉我在printf中使用%lf不正确。那么,如果scanf()需要%lf,怎么可以用在printf()中用%f输出双精度数呢?
13.8对于size_t那样的类型定义,当我不知道它到底是long还是其它类型的时候,我应该使用什么样的printf格式呢?
13.9我如何用printf实现可变的域宽度?就是说,我想在运行时确定宽度而不是使用%8d?
13.10如何输出在千位上用逗号隔开的数字?金额数字呢?
13.11为什么scanf("%d
13.12为什么char s[30];scanf("%s
13.13为什么这些代码double d;scanf("%f
13.14怎样在scanf()格式串中指定可变的宽度?
13.15当我用``%d\\n"调用scanf从键盘读取数字的时候,好像要多输入一行函数才返回。
13.16我用scanf%d读取一个数字,然后再用gets()读取字符串,但是编译器好像跳过了gets()调用!
13.17我发现如果坚持检查返回值以确保用户输入的是我期待的数值,则scanf()的使用会安全很多,但有的时候好像会陷入无限循环。
13.18为什么大家都说不要使用scanf()?那我该用什么来代替呢?
13.19我怎样才知道对于任意的sprintf调用需要多大的目标缓冲区?怎样才能避免sprintf()目标缓冲区溢出?13.20为什么大家都说不要使用gets()?
13.21为什么调用printf()之后errno内有ENOTTY?
13.22fgetops/fsetops和ftell/fseek之间有什么区别?fgetops()和fsetops()到底有什么用处?
13.23如何清除多余的输入,以防止在下一个提示符下读入?fflush(stdin)可以吗?
13.24既然fflush()不能,那么怎样才能清除输入呢?
13.25对某些路径文件名调用fopen()总是失败。
13.26我想用``r+"打开一个文件,读出一个字符串,修改之后再写入,从而就地更新一个文件。可是这样不行。
13.27怎样在程序里把stdin或stdout重定向到文件?
13.28一旦使用freopen()之后,怎样才能恢复原来的stdout(或stdin)?
13.29怎样同时向两个地方输出,如同时输出到屏幕和文件?
13.30怎样正确的读取二进制文件?我有时看到0x0a和0x0d混淆了,而且如果数据中包含0x1a的话,我好像会提前遇到EOF。
14.库函数
14.1怎样把数字转为字符串(与atoi相反)?有itoa()函数吗?
14.2为什么strncpy()不能总在目标串放上终止符'\\0'?
14.3为什么有些版本的toupper()对大写字符会有奇怪的反应?为什么有的代码在调用toupper()前先调用tolower()?
14.4怎样把字符串分隔成用空白作间隔符的段?怎样实现类似传递给main()的argc和argv?
14.5我需要一些处理正则表达式或通配符匹配的代码。
14.6我想用strcmp()作为比较函数,调用qsort()对一个字符串数组排序,但是不行。
14.7我想用qsort()对一个结构数组排序。我的比较函数接受结构指针,但是编译器认为这个函数对于qsort()是错误类型。我要怎样转换这个函数指针才能避免这样的警告?
14.8怎样对一个链表排序?
14.9怎样对多于内存的数据排序?
14.10怎样在C程序中取得当前日期或时间?
14.11我知道库函数localtime()可以把time_t转换成结构struct tm,而ctime()可以把time_t转换成为可打印的字符串。怎样才能进行反向操作,把struct tm或一个字符串转换成time_t?
14.12怎样在日期上加N天?怎样取得两个日期的时间间隔?
14.13我需要一个随机数生成器。
14.14怎样获得在一定范围内的随机数?
14.15每次执行程序,rand()都返回相同顺序的数字。
14.16我需要随机的真/假值,所以我用直接用rand()%2,可是我得到交替的0,1,0,1,0……
14.17怎样产生标准分布或高斯分布的随机数?
14.18我不断得到库函数未定义错误,但是我已经#inlude了所有用到的头文件了。
14.19虽然我在连接时明确地指定了正确的函数库,我还是得到库函数未定义错误。
14.20连接器说_end未定义代表什么意思?
14.21我的编译器提示printf未定义!这怎么可能?
15.浮点运算
15.1一个float变量赋值为3.1时,为什么printf输出的值为3.0999999?
15.2执行一些开方根运算,可是得到一些疯狂的数字。
15.3做一些简单的三角函数运算,也引用了#include 15.4浮点计算程序表现奇怪,在不同的机器上给出不同的结果。 15.5有什么好的方法来验对浮点数在``足够接近"情况下的等值? 15.6怎样取整数? 15.7为什么C不提供乘幂的运算符? 15.8为什么我机器上的 15.9怎样测试IEEE NaN以及其它特殊值? 15.10在C中如何很好的实现复数? 15.11我要寻找一些实现以下功能的程序源代码:快速傅立叶变换(FFT)、矩阵算术(乘法、倒置等函数)、复数算术。 15.12Turbo C的程序崩溃,显示错误为``floating point formats not linked"(浮点格式未连接)。 16.可变参数 16.1为什么调用printf()前,必须要用#include 16.2为什么%f可以在printf()参数中,同时表示float和double?他们难道不是不同类型吗? 16.3为什么当n为long int,printf("%d 16.4怎样写一个有可变参数的函数? 16.5怎样写类似printf()的函数,再把参数转传给printf()去完成大部分工作? 16.6怎样写类似scanf()的函数,再把参数转传给scanf()去完成大部分工作? 16.7怎样知道实际上有多少个参数传入函数? 16.8为什么编译器不让我定义一个没有固定参数项的可变参数函数? 16.9我有个接受float的可变参函数,为什么va_arg(argp,float)不工作?16.10va_arg()不能得到类型为函数指针的参数。 16.11怎样实现一个可变参数函数,它把参数再传给另一个可变参数函数? 16.12怎样调用一个参数在执行是才建立的函数? 17.奇怪的问题 17.1遇到不可理解的不合理语法错误,似乎大段的程序没有编译。 17.2为什么过程调用不工作?编译器似乎直接跳过去了。 17.3程序在执行用之前就崩溃了,用调试器单步跟进,在main()之前就死了。 17.4程序执行正确,但退出时崩溃在main()最后一个语句之后。为什么会这样? 17.5程序在一台机器上执行完美,但在另一台上却得到怪异的结果。更奇怪的是,增加或去除调试的打印语句,就改变了症状…… 17.6为什么代码:char*p="hello,worl!";p[0]='H';会崩溃? 17.7``Segmentation violation 18.风格 18.1什么是C最好的代码布局风格? 18.2用if(!strcmp(s1,s2))比较两个字符串等值,是否是个好风格? 18.3为什么有的人用if(0==x)而不是if(x==0)? 18.4原型说明extern int func__((int,int));中,那些多出来的括号和下划线代表了什么? 18.5为什么有些代码在每次调用printf()前,加了类型转换(void)? 18.6什么是``匈牙利标志法"(Hungarian Notation)?是否值得用? 18.7哪里可以找到``印第安山风格指南"(Indian Hill style Guide)及其它编码标准? 18.8有些人说goto是的,我应该永不用它。那是否太极端了? 19.工具和资源 19.1常用工具列表。 19.2怎样抓捕棘手的malloc问题? 19.3有什么免费或便宜的编译器可以使用? 19.4刚刚输入完一个程序,但它表现的很奇怪。你可以发现有什么错误的地方吗? 19.5哪里可以找到兼容ANSI的lint? 19.6难道ANSI函数原型说明没有使lint过时吗? 19.7网上有哪些C的教程或其它资源? 19.8哪里可以找到好的源代码实例,以供研究和学习? 19.9有什么好的学习C的书?有哪些高级的书和参考? 19.10哪里可以找到标准C函数库的源代码? 19.11是否有一个在线的C参考指南? 19.12哪里可以得到ANSI/ISO C标准? 19.13我需要分析和评估表达式的代码。 19.14哪里可以找到C的BNF或YACC语法? 19.15谁有C编译器的测试套件? 19.16哪里有一些有用的源代码片段和例子的收集? 19.17我需要执行多精度算术的代码。 19.18在哪里和怎样取得这些可自由发布的程序? 20.系统依赖 20.1怎样从键盘直接读入字符而不用等RETURN键?怎样防止字符输入时的回显?20.2怎样知道有未读的字符,如果有,有多少?如果没有字符,怎样使读入不阻断? 20.3怎样显示一个百分比或``转动的短棒"的进展表示器? 20.4怎样清屏?怎样输出彩色文本?怎样移动光标到指定位置? 20.5怎样读入方向键,功能键? 20.6怎样读入鼠标输入? 20.7怎样做串口(``comm")的输入输出? 20.8怎样直接输出到打印机? 20.9怎样发送控制终端或其它设备的逃逸指令序列? 20.10怎样直接访问输入输出板? 20.11怎样做图形? 20.12怎样显示GIF和JPEG图象? 20.13怎样检验一个文件是否存在? 20.14怎样在读入文件前,知道文件大小? 20.15怎样得到文件的修改日期和时间? 20.16怎样缩短一个文件而不用清除或重写? 20.17怎样在文件中插入或删除一行(或记录)? 20.18怎样从一个打开的流或文件描述符得到文件名? 20.19怎样删除一个文件? 20.20怎样复制一个文件? 20.21为什么用了详尽的路径还不能打开文件?fopen("c:\\newdir\\file.dat 20.22fopen()不让我打开文件:"$HOME/.profile"和"~/.myrcfile"。 20.23怎样制止MS-DOS下令人担忧的``Abort,Retry,Ignore?"信息? 20.24遇到``Too many open files(打开文件太多)"的错误,怎样增加同时打开文件的允许数目? 20.25怎样在C中读入目录? 20.26怎样找出系统还有多少内存可用? 20.27怎样分配大于K的数组或结构? 20.28错误信息``DGROUP data allocation exceedsK(DGROUP数据分配内存超过K)"说明什么?我应该怎么做?我以为使用了大内存模型,那我就可以使用多于K的数据! 20.29怎样访问位于某的特定地址的内存(内存映射的设备或图显内存)? 20.30怎样在一个C程序中调用另一个程序(可执行的程序,或系统命令)? 20.31怎样调用另一个程序或命令,同时收集它的输出? 20.32怎样才能发现程序自己的执行文件的全路径? 20.33怎样找出和执行文件在同一目录的配置文件? 20.34一个进程如何改变它的调用者的环境变量? 20.35怎样读入一个对象文件并跳跃到其中的地址? 20.36怎样实现精度小于秒的延时或记录用户回应的时间? 20.37怎样抓获或忽略像control-C这样的键盘中断? 20.38怎样很好地处理浮点异常? 20.39怎样使用socket?网络化?写客户/服务器程序?20.40怎样调用BIOS函数?写ISR?创建TSR? 20.41编译程序,编译器出示``union REGS"未定义错误信息,连接器出示``int86()"的未定义错误信息。 20.42什么是``near"和``far"指针? 20.43我不能使用这些非标准、依赖系统的函数,程序需要兼容ANSI! 21.杂项 21.1怎样从一个函数返回多个值? 21.2怎样访问命令行参数? 21.3怎样写数据文件,使之可以在不同字大小、字节顺序或浮点格式的机器上读入? 21.4怎样调用一个由char*指针指向函数名的函数? 21.5怎样实现比特数组或集合? 21.6怎样判断机器的字节顺序是高字节在前还是低字节在前? 21.7怎样掉换字节? 21.8怎样转换整数到二进制或十六进制? 21.9我可以使用二进制常数吗?有printf()的二进制的格式符吗? 21.10什么是计算整数中比特为1的个数的最有效的方法? 21.11什么是提高程序效率的最好方法? 21.12指针真得比数组快吗?函数调用会拖慢程序多少?++i比i=i+1快吗? 21.13人们说编译器优化的很好,我们不在需要为速度而写汇编了,但我的编译器连用移位代替i/=2都做不到。 21.14怎样不用临时变量而交换两个值? 21.15是否有根据字符串做切换的方法? 21.16是否有使用非常量case标志的方法(例如范围或任意的表达式)? 21.17return语句外层的括号是否真的可选择? 21.18为什么C注释不能嵌套?怎样注释掉含有注释的代码?引用字符串内的注释是否合法? 21.19C是个伟大的语言还是别的?哪个其它语言可以写象a+++++b这样的代码? 21.20为什么C没有嵌套函数? 21.21assert()是什么?怎样用它? 21.22怎样从C中调用FORTRAN(C++,BASIC,Pascal,Ada,LISP)的函数?反之亦然? 21.23有什么程序可以做从Pascal或Fortran(或LISP,Ada,awk,``老"C)到C的转换? 21.24C++是C的超集吗?可以用C++编译器来编译C代码吗? 21.25需要用到``近似"的strcmp,比较两个字符串的近似度,并不需要完全一样。 21.26什么是散列法? 21.27由一个日期,怎样知道是星期几? 21.28(year%4==0)是否足够判断润年?2000年是闰年吗? 21.29一个难题:怎样写一个输出自己源代码的程序? 21.30什么是``达夫设备"(Duff's Device)? 21.31下届国际C混乱代码竞赛(IOCCC)什么时候进行?哪里可以找到当前和以前的获胜代码? 21.32[K&R1]提到的关健字entry是什么? 21.33C的名字从何而来? 21.34``char"如何发音? 21.35``lvalue"和``rvalue"代表什么意思? 21.36哪里可以取得本FAQ(英文版)的额外副本?下载本文