C\C++

C Primer Plus 第9章 函数 9.2 ANSI C 的函数原型

蓝咒 提交于 2019-12-01 09:55:28
9.2.1 产生的问题 下面我们讨论几个使用imax()函数的例子,该函数和imin()类似。在程序清单9.4中的程序以旧的形式声明函数imax(),然后错误的使用该函数。 程序清单9.4 misuse.c程序 /*misuse.c --不正确的使用函数*/ #include <stdio.h> int imax(); /*旧式的函数声明*/ int main(void) { printf("The maximum of %d and %d is %d.\n", 3,5,imax(3)); printf("The maximum of %d and %d is %d.\n", 3,5,imax(3.0,5.0)); return 0; } int imax(n,m) int n,m; { int max; if(n>m) max=n; else max=m; return max; } 在第一个printf()中调用函数imax()时漏掉了一个参数,而在第二次调用imax()时使用了浮点参数而不是整数参数。尽管存在这些错误,该程序仍可以编译执行。 程序运行时发生了什么?不同操作系统的内部机制不同,所以出现错误的具体情况也不相同。当使用PC或VAX时,程序执行过程是这样的: 调用函数首先把参数放在一个被称为堆栈(stack)的临时存储区域里,然后被调函数从堆栈中读取这此参数

C Primer Plus 第9章 函数 9.4 多源代码文件程序的编译

拈花ヽ惹草 提交于 2019-11-30 04:51:09
9.4.1 UNIX 首先假定UNIX系统下安装了标准的UNIX C 编译器cc。文件file1.c和file2.c中包含有C的函数。下面的命令将把这两个文件编译在一起并生成可执行文件a.out; cc file1.c file2.c 另外还将生成两个目标文件file1.o和file2.o。如果随后只更改了file1.c而没有改变file2.c,可以使用以下命令编译第一个文件并将其链接到第二个文件的目标代码: cc file1.c file2.o 在UNIX系统下有一个make命令可以自动管理多文件程序,本处不对此深入讨论。 9.4.2 LINUX 首先假定Linux系统下安装了GNU C 编译器gcc。文件file1.c和file2.c中包含有C的函数。下面的命令将把这两个文件编译在一起并生成可执行文件a.out; gcc file1.c file2.c 另外还将生成两个目标文件file1.o和file2.o。如果随后只更改了file1.c而没有改变file2.c,可以使用以下命令编译第一个文件并将其链接到第二个文件的目标代码: gcc file1.c file2.o 9.4.3 DOS命令行编译器 大多数DOS命令行编译器的工作机制同UNIX系统下的cc命令类似。一个不同之处在于DOS系统下目标文件的扩展名是.obj而不是.o。而且有些编译器并不生成目标代码文件

C Primer Plus 第11章 字符串和字符串函数 11.4 自定义字符串I/O函数

 ̄綄美尐妖づ 提交于 2019-11-30 04:50:44
不一定要使用标准C库的函数进行输入和输出。如果不具备或者不喜欢它们,您可以自行定义,在getchar() putchar()的基础上建立自己的函数。 假定您希望有一个类似puts()但并不自动添加换行符的函数。程序清单11.10给出了一种方法。 程序清单11.10 put1.c程序 /*put1.c 不添加换行符打印一个字符串*/ #include <stdio.h> void put1(const char *string) /*不会改变这个字符串*/ { while(*string !='\0') putchar(*string++); } char指针string最初指向被调参数的第一个元素。由于这个函数并不改变字符串,因此使用了const修饰符。这一元素的内容输出以后,指针递增并指向下一个元素。这个过程一直继续下去,直到指针指向一个包含空字符的元素。 记住,++比*的优先级高,这意味着putchar(*string++)输出string指向的值,然后再增加string本身,而不是增加stirng指向的字符 。 可以把put1.c看作自定义字符串处理函数的范例。 每个字符串都有一个空字符标志其结束,因此不必向函数传递字符串的大小。相反,函数依次处理每个字符直到遇到空字符。 用数组符号写这个函数会比较长: int i = 0; while(string[i]!='\0')

C Primer Plus 第11章 字符串和字符串函数 11.1字符串表示和字符串I/O

空扰寡人 提交于 2019-11-30 04:50:32
当然,最基本的您已经知道了: 字符串(character string)是以空字符(\o)结尾的char数组 。因此,您所学的数组和指针就可以用在字符串上。但是由于字符串的使用非常广泛,C提供了很多专为字符串设计的函数。本章将讨论字符串的特性、声明和初始化方法、如何在程序中输入输出字符串,以及字符串的操作。 程序清单11.1 string.c程序 //string.c --使用字符串与用户交互 #include <stdio.h> #define MSG "You must have many talents. Tell me some. " #define LIM 5 #define LINELEN 81 //最大字符串长度加1 int main(void) { char name[LINELEN]; char talents[LINELEN]; int i; const char m1[40]="Limit yourself to one line's worth. "; //初始化一个大小已确定的char数组 const char m2[]="If you can't think of anything,fake it. ";//让编译器计算数组大小 const char *m3="\nEnough about me - what's your name? "; /

C Primer Plus 第11章 字符串和字符串函数 11.3 字符串输出

假如想象 提交于 2019-11-29 03:45:34
11.3.1 puts( )函数 puts( )函数的使用很简单, 只需要给出字符串参数的地址。 程序清单11.8列出了输出字符串的多种方式。 程序清单11.8 put_out.c程序 /*put_out.c 使用puts( )函数*/ #include<stdio.h> #define DEF "I am a #define string." int main(void) { char str1[80]="An array was initialized to me."; const char * str2 ="A pointer was initialized to me."; puts("I'm an argument to puts( ). "); puts(DEF); puts(str1); puts(str2); puts(&str1[5]); puts(str2+4); return 0; } 输出如下: I'm an argument to puts( ). I am a #define string. An array was initialized to me. A pointer was initialized to me. ray was initialized to me. inter was initialized to me. 注意

C Primer Plus 第11章 11.9 把字符串转换为数字

假装没事ソ 提交于 2019-11-29 03:45:22
数字即能以字符串形式也能 以数字形式存储。以字符串形式存储数字就是存储数字字符。例如,数字213即能以数字'2'、‘1’、‘3’、‘\0’的形式存储在一个字符串数组中。以数字形式存储213意味着把字存储为 一个int数值。对于数字运算C要求数字形式。但是在屏幕上显示数字却要求字符串形式,这是因为屏幕显示的字符。printf()和sprintf()函数通过%d或其他说明符把数字形式转换为字符串形式或者相反。C还有一些函数专门用于把字符串形式转换为数字形式。 假如,您想编写一个使用数字命令程序。很不巧的是,命令行参数是以字符串形式被读取的。因此,要想使用数字值,就必须先把字符串转换为数字。如果数字是个整数,那就可以使用atoi()(代表alphanumeric to integer)。atoi()函数以字符串为参数,返回相应的整数值。 程序清单11.28 hello.c程序 /*hello.c 把命令行参数转换成数字*/ #include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[]) { int i,times; if(argc<2 || (times = atoi(argv[1]))<1) printf("Usage: %s positive-number\n",argv[0]); else for(i=0

C Primer Plus 第11章 字符串和字符串函数 11.5 字符串函数

♀尐吖头ヾ 提交于 2019-11-27 19:30:04
C库提供了许多处理字符串的函数:ANSI C 用头文件string.h给出这些函数的原型。下面是一些最有用和最常用的函数:strlen() 、strcat()、strncat() 、strcmp() 、strncmp() 、strcpy()、 strncpy()。此外,我们也将研究一下头文件stdio.h支持的sprintf()函数。 11.5.1 strlen( )函数 我们已经知道, 用strlen()函数可以得到字符串的长度。 下面的函数中用到了strlen()函数,这是一个可以缩短字符串长度的函数: /*test_fit.c-*/ void fit (char * string,unsigned int size) { if(strlen(string)>size) *(string+size)='\0'; } 这个函数确实要改变字符串,因此在函数头中声明形式参量string时没有使用const修饰符。 在程序清单11.13的程序中测试一下fit( )函数。注意,代码中用到C的字符串文本串联功能。 程序清单11.13 test.c程序 /*test.c 试用缩短字符串的函数*/ #include <stdio.h> #include <string.h> void fit(char *,unsigned int ); int main(void) { char msg[]=

C Primer Plus 第8章 字符输入/输出和输入确认 8.11 编程练习答案

牧云@^-^@ 提交于 2019-11-27 19:29:50
1、设计一个程序,统计从输入到文件结尾为止的字符数。 #include <stdio.h> int main(void) { int i; for(i=0; getchar() != EOF; i++); printf("There are %d char",i); return 0; } 2、编写一个程序,把输入作为字符流读取,直到遇到EOF。令该程序打印每个输入字符及其ASCII编码的十进制值。注意在ASCII序列中空格字符 前面的字符 是非打印字符,要特殊处理这些字符。如果非打印字符是换行符或制表符,则分别打印\n或\t。否则,使用控制字符符号。例如,ASCII 的1是ctrl+A,可以显示为^A。注意A的ASCII值是ctrl+A的值加64。对其他非打印字符也保持相似的关系。除每次遇到一个换行符时就开始一个新行之外,每行打印10对值。 #include <stdio.h> int main(void) { char ch; int i; for(i=1; (ch=getchar()) != EOF; i++) { if (ch >= ' ' || ch == '\n' || ch == '\t') printf("%-5c",ch); else printf("^%-4c",ch+64); printf("%-5d",ch); if(i%8 == 0) printf("\n

C Primer Plus 第11章 11.13 编程练习答案

流过昼夜 提交于 2019-11-27 19:29:35
1、设计并测试一个函数,可以从输入读取n个字符(包括空格、制表符和换行符),把结果存储在一个数组中,这个数组的地址通过参数来传递。 #include<stdio.h> void input(char *p,int n); int main(void) { char a[81]; int n; puts("Input the number of the string."); scanf("%d",&n); getchar(); /*滤去回车*/ puts("Input the string."); input(a,n); puts(a); return 0; } void input(char *p,int n) { int i; for(i=0;i<n;i++) *(p+i)=getchar(); *(p+i)='\0'; } 2、修改并测试练习1中的函数,使得可以在n个字符后,或第一个空格、制表符、换行符后停止读取输入,由上述情况中最先被满足的那个终止读取(不能使用scanf()函数)。 #include<stdio.h> #include<ctype.h> void input(char *p,int n); int main(void) { char a[81]; int n; puts("Input the number of the string."); scanf("

C Primer Plus 第11章 字符串和字符串函数 11.2 字符串输入

纵然是瞬间 提交于 2019-11-27 19:29:19
11.2.1 创建存储空间 要做的第一件事是建立一个空间以存放读入的字符串。 最简单的办法就是在声明中明确指出数组的大小: char name[81] ; 现在的name是一个已经分配81字节存储块的地址。另一个方法是使用C库里分配存储空间的函数,这一点会在第12章讨论。 为字符串预留空间后,就可以读取字符串了。C库提供了三个读取字符串的函数:scanf( )、gets( )和fgets( )。我们先讨论最常用的gets( )。 11.2.2 gets( ) 函数 它从系统的标准输入设备(通常是键盘)获取一个字符串。因为字符串没有预定的长度,所以gets( )需要知道何时结束。解决办法是读字符串直到遇到一个换行字符(\n),按回车键可以产生这个字符。它读取换行符(不包括换行符)之前的所有字符,在这些字符后添加一个空字符(\o),然后把这个字符串交给调用它的程序。它将读取换行符并将其丢弃,这样下一次读取就会在新一行开始。 程序清单11.4 name1.c程序 /*name1.c 读取一个名字*/ #include<stdio.h> #define MAX 81 int main(void) { char name[MAX]; /*分配空间*/ printf("Hi,what's your name?\n"); gets(name); /*把字符串放进name数组*/ printf(