C语言第8章 字符串
第8章 编译预处理-C语言程序设计-王晓峰-清华大学出版社
【例8. 7】 带参宏定义的实参是表达式的情况。
【程序】 #include <stdio.h> #define SQ(y) (y)*(y) int main() { int a,sq; printf("input a number: ");
④90。表达式3*F( 3+2)被替换为3*(( 3+2)*( 3+2)+( 3+2))。
【例8. 6】 一个宏定义代表多个语句。
【程序】 #include <stdio.h> #define SSSV(s1,s2,s3,v) s1=l*w; s2=l*h; s3=w*h; v=w*l*h; int main() { int l=3,w=4,h=5,sa,sb,sc,vv;
printf("PI is %9.7f.\n",PI); return 0;
}
【运行】 PI is 3.1415926
【例8. 3】 用无参宏定义表示常用的数据类型和输出格式。
【程序】 #include <stdio.h> #define INTEGER int #define REAL float #define P printf #define D "%d\n“ #define F "%f\n" int main() { INTEGER a=5, c=8, e=11;
REAL b=3.8, d=9.7, f=21.08; P(D F,a,b); P(D F,c,d); P(D F,e,f); return 0; }
《C语言程序设计》第8章指针
10.3.3 指针变量和数组作函数参数 数组名作形参时,接收实参数组的起始地址;
作实参时,将数组的起始地址传递给形参数组。
引入指向数组的指针变量后,数组及指向数 组的指针变量作函数参数时,可有4种等价形式 (本质上是一种,即指针数据作函数参数):
(1)形参、实参都用数组名 (2)形参、实参都用指针变量 (3)形参用指针变量、实参用数组名 (4)形参用数组名、实参用指针变量
(4)指针变量的++、--与&、*的结合
对于指针变量的++、--与&、*的结合 使用,关键要注意按照运算符的优先级和 结合性进行。
例如: int a=2, *p; p=&a;
•表达式:(*p)++,按运算符的优先级,等价于 a++。其含义为:取出指针变量p所指向的内存单 元的值(即a的值),a的值加1,送回a的内存单 元,a的值变为3,p的值未发生变化,仍然指向 变量a。
程序说明:printf("%s\n",s);语句 通过指向字符串的指针变量s,整体引
用它所指向的字符串的原理:系统首先输出s 指向的第一个字符,然后使s自动加1,使 之指向下一个字符;重复上述过程,直至遇到 字符串结束标志。
main() { char string[ ]=”I love Beijing.”; printf(“%s\n”,string); }
3.数组元素的引用 数组元素的引用,既可用下标法,也可用
指针法。
10.3.2 通过指针引用数组元素 如果有“int a [10],*p=a;” ,则: (1)p+i和a+i都是数组元素a [i]的地址。
(2)*(p+i)和*(a+i)就是数组元素a [i]。 int a [3]; a [0]——*a a [1]——*(a +1) a [2]——*(a +2)
C语言程序设计知识点—第8章 指针结构体与预处理命令
指针使用示例 2 void main() { int num1 = 50, num2 = 100; int *ptr1, *ptr2; ptr1 = &num1; printf(" num1 的值是: %d", *ptr1); printf("\n num1 的地址是: %x \n", ptr1); ptr2 = &num2; printf("\n num2 的值是: %d", *ptr2); printf("\n num2 的地址是: %x \n", ptr2); *ptr2 = *ptr1; printf("\n 重新赋值后 num2 的值是: %d", *ptr2); printf("\n 重新赋值后 num2 的地址是: %x\n", ptr2); }
C 语言程序设计知识点
主讲教师:杨剑
第 8 章:指针、结构体与预处理命令
1. 本章目标
理解指针的概念 定义指针变量 掌握对指针的操作 理解指针和数组的关系 理解结构体的概念和定义 理解预处理指令
2. 内存地址
内存是一个连续编址的空间,每一个存储单元都有一个固定的编号,称为内存地址。 内存地址通常用 16 进制数表示。
c语言第8章-编译预处理及位运算习题答案doc资料
c语言第8章-编译预处理及位运算习题答案编译预处理习题一.单项选择题1.在宏定义#define A 3.897678中,宏名A代替一个()。
A)单精度数 B)双精度数 C)常量 D)字符串2.以下叙述中正确的是A)预处理命令行必须位于源文件的开头 B)在源文件的一行上可以有多条预处理命令C)宏名必须用大写字母表示D)宏替换不占用程序的运行时间3.C语言的编译系统对宏命令的处理()。
A)在程序运行时进行的B)在程序连接时进行的C)和C程序中的其它语句同时进行的D)在对源程序中其它语句正式编译之前进行的4.在文件包含预处理语句的中,被包含文件名用“< >”括起时,寻找被包含文件的方式是()。
A)直接按系统设定的标准方式搜索目录B)先在源程序所在目录搜索,再按系统设定的标准方式搜索C)仅仅在源程序所在目录搜索D)仅仅搜索当前目录5.以下说法中正确的是A)#define和printf都是C语句 B)#define是C语句,而printf不是C)printf是C语句,但#define不是D)#define和printf都不是C 语句6.#define A 3.897678#include <stdio.h>main( ){ printf(“A=%f ”,A);}程序运行结果为()。
A) 3.897678=3.897678 B) 3.897678=A C) A=3.897678 D)无结果7.有宏定义:#define LI(a,b) a*b#define LJ(a,b) (a)*(b)在后面的程序中有宏引用:x=LI(3+2,5+8);y=LJ(3+2,5+8);则x、y的值是()。
A) x=65,y=65 B) x=21,y=65 C) x=65,y=21 D)x=21,y=218.有以下程序# define f(x) (x*x)main(){ int i1, i2;i1=f(8)/f(4) ; i2=f(4+4)/f(2+2) ;printf("%d, %d\n",i1,i2);}程序运行后的输出结果是A)64, 28 B)4, 4 C)4, 3D)64, 649.以下程序的输出结果是#define M(x,y,z) x*y+zmain(){ int a=1,b=2, c=3;printf(“%d\n”, M(a+b,b+c, c+a));}A) 19 B) 17 C) 15 D) 1210.有以下程序#define N 5#define M1 N*3#define M2 N*2main(){ int i;i=M1+M2; printf(“%d\n”,i);}程序编译后运行的输出结果是:A) 10 B) 20 C) 25 D) 3011.有如下程序#define N 2#define M N+1#define NUM 2*M+1#main(){ int i;for(i=1;i<=NUM;i++)printf(“%d\n”,i);}该程序中的for循环执行的次数是A) 5 B) 6C) 7 D) 812.位运算是对运算对象按二进制位进行操作的运算,运算的对象是____数据,以___的形式参与运算。
C语言中如何进行字符串操作
C语言中如何进行字符串操作第一章:字符串介绍和初始化在C语言中,字符串是一个由字符组成的字符数组。
在使用字符串操作之前,我们需要了解字符串的初始化方式。
字符串可以通过以下几种方式进行初始化:1. 使用字符数组初始化字符串:可以直接创建一个字符数组,并将字符串赋值给它。
例如:char str[10] = "hello";2. 使用字符串常量初始化字符串:可以直接使用双引号将字符串括起来并赋值给字符串变量。
例如:char str[] = "world";3. 使用指针初始化字符串:可以使用指针指向字符串常量,并将指针赋值给字符串变量。
例如:char *str = "welcome";第二章:字符串输入和输出C语言提供了多种方式进行字符串的输入和输出操作。
可以使用printf()函数输出字符串,使用scanf()函数输入字符串。
1. 输出字符串:使用printf()函数并使用%s格式控制符。
例如:char *str = "hello";printf("String: %s\n", str);2. 输入字符串:使用scanf()函数并使用%s格式控制符。
例如:char str[10];scanf("%s", str);第三章:字符串长度和拷贝在C语言中,可以使用strlen()函数获取字符串的长度,并可以使用strcpy()函数将一个字符串拷贝到另一个字符串中。
1. 获取字符串长度:使用strlen()函数可以获取字符串的长度。
例如:char str[] = "hello";int length = strlen(str);printf("Length: %d\n", length);2. 拷贝字符串:使用strcpy()函数可以将一个字符串拷贝到另一个字符串中。
C语言程序设计(李圣良)章 (8)
第8单元 文 件 (3) 关闭文件。关闭文件即表示文件使用完毕,让操作系 统撤消缓冲区。应注意,当文件使用完毕时,必须执行关闭文 件操作,否则数据有可能丢失。原因是在写文件过程中,当缓 冲区没有写满时,系统就不会将数据存到外存文件中,这时若 没有执行关闭文件操作,则关闭操作系统时数据便会丢失。若 执行了正常关闭文件操作,系统就会在撤消缓冲区之前把没有 写满缓冲区中的数据存到外存文件中,就不会造成数据的丢失。
第8单元 文
文件使用方式 "r" "w" "a" "rb" "wb" "ab" "r+" "w+" "a+"
"rb+" "wb+" "ab+"
件
表 8-1 文件使用方式
含义 只读,为输入打开一个文本文件 只写,为输出新建一个文本文件 追加,向文本文件尾添加数据 只读,为输入打开一个二进制文件 只写,为输出新建一个二进制文件 追加,向二进制文件尾添加数据 读写,为读/写打开一个文本文件 读写,为读/写新建一个文本文件 读写,向文本文件尾添加数据,同时可读 读写,为读/写打开一个二进制文件 读写,为读/写新建一个二进制文件 读写,向二进制文件尾添加数据,同时可读
第8单元 文 件 8.1.2 文件的基本操作
1. 文件指针变量 在缓冲文件系统中,关键的概念就是“文件指针”。对于 每一正在被使用的文件,都会在内存中开辟一个区,专门用来 存放文件的相关信息。其中包括文件的名字、文件的状态以及 文件的当前位置等信息,而这些信息都是保存在一个结构体的 变量中,该结构体类型是由系统定义的,取名为FILE。而在C 语言中,这些文件类型的声明均在“stdio.h”头文件中。
高树芳C语言程序设计--第八章
30
8.5 知识拓展
案例8-11 指针的高级应用 [案例任务] 阅读下列程序 ,分析运行结果,了解指 针的各种应用。
程序代码
31
8.5 知识拓展
相关知识:
1.有关指针的数据类型小结 2.案例说明 3.main函数的参数
32
12
8.2 指针变量
[课堂训练8-1] void swap(int *p1,int *p2) { int *t; t=p1; p1=p2; p2=t; }
1.分析下面的程序,写出运行结果。 #include <stdio.h> void main() { void swap(int *p1,int *p2); int *p1,*p2,a=6,b=8; p1=&a; p2=&b; printf(" 交换前:*p1=%d,*p2=%d\n",*p1,*p2); swap(p1,p2); printf(" 交换后:*p1=%d,*p2=%d\n",*p1,*p2); }
17
8.3 指针与数组
案例8-6 [案例任务]
冒泡排序
使用指针指向一维整型数组,使用冒泡排 序法对数组元素从小到大排序并输出。
程序代码
18
8.3 指针与数组
相关知识: 1.冒泡排序法 2.指针变量的其他运算
19
8.3 指针与数组
案例8-7 [案例任务]
逆置一维数组
使用数组名或指针变量作为函数形参与实 参,完成一维数组元素的逆置。请分析程 序运行结果,并对两个方法进行比较。
6
8.2 指针变量
案例8-2 用指针交换两整数 案例8-3 用指针比较两数大小 案例8-4 用指针参数交换两整数
浙大版《c语言程序设计(第4版)》讲解
浙大版《c语言程序设计(第4版)》讲解《C语言程序设计》是国内C语言教材的重要书籍,高校中的计算机专业等都有教授。
浙大版《C语言程序设计(第4版)》是由著名计算机科学家袁春风编写的C语言教材,该书主要介绍了C语言基础、字符串、数组、指针、结构体、文件操作等内容。
本文将对该书内容做简要概括。
第一部分:C语言基础第一章:概述该章主要介绍了计算机语言的发展与演化,C语言的历史和主要特点,以及C语言的应用领域和发展前景。
第二章:初识C语言该章节主要介绍了C语言的基本概念,例如标识符、关键字、注释等。
并且结合一些简单的例子介绍了C语言的语法格式和执行规则。
第三章:数据类型该章节主要介绍了C语言的数据类型,包括整型、实型、字符型、布尔型等。
并且介绍了类型转换及其规则。
第四章:运算符与表达式该章节主要介绍了C语言的基本运算符及其优先级、结合性和作用。
并且通过实例来介绍了使用运算符和表达式的方法及注意事项。
第五章:分支结构该章节主要介绍了C语言中的分支结构,包括if、if-else、switch等,以及运用分支结构解决问题的方法和技巧。
第二部分:数组、字符串和指针第七章:数组该章节主要介绍了C语言中的数组,包括一维数组、二维数组等,并结合例子介绍了数组的定义、初始化、遍历、赋值等操作。
第八章:字符串该章节主要介绍了C语言中的字符串,包括字符串的定义、初始化、输入、输出等。
并且介绍了使用字符串解决问题的方法和技巧。
第九章:指针第三部分:函数与结构体该章节主要介绍了C语言中的结构体,包括结构体的定义、初始化、访问、结构体数组、结构体指针等。
并且介绍了结构体在程序中的应用。
第四部分:文件操作与其他第十二章:文件操作第十三章:其他语言特性与扩展该章节主要介绍了C语言扩展的特性,包括宏定义、预处理指令、变长参数等。
并且介绍了C语言与其他语言的异同点。
总结:《C语言程序设计(第4版)》是一本权威的C语言教材,该书系统全面地介绍了C语言的基本概念、语法格式、运算符、控制语句、数组、指针、函数、结构体、文件操作等方面的内容,让读者对C语言的掌握更加深入。
C语言程序设计基础 第8章 数据文件处理技术
offset为long型的位移量,以ptname为基准,移动 的字节数。
函数返回值:成功移动返回0,否则返回非0。
10. 函数fseek-例 【例1】 fseek (fp, 40L, SEEK_SET); 表示:将当前位置移到离文件头40个字节处。 【例2】 fseek(fp, 20L, SEEK_CUR); 表示:将当前位置移到离当前位置20个字节处。 【例3】 fseek(fp, -30L, SEEK_END);
文件不能打开时,函数 fopen()将返回空指针值 NULL。 程序应考虑到文件不能正常打开的极端情况,应用以下形式 的代码描述打开一个文件的要求: if ((fp = fopen(fname, "r")) == NULL) { printf("不能打开文件 %s。\n", fname); return; }
fputc()和fgetc()函数-例2
【例2】将一个文件中的数据复制到另一个文件中。 #include <stdio.h>
void main()
{ FILE *in, *out; char ch, infile[40], outfile[40]; gets (infile); if (( in = fopen(infile, "r")) == NULL) { printf ("不能打开源文件 %s\n", infile); scanf ("%*c"); return; } /* 起暂停作用 */
12. 成批读数据函数fread() 形式指向的文件读入count*size个字节,存入buffer。 函数返回值:读取成功返回count值,否则返回0。
说明:常用于二进制文件的读。
C语言字符串数组详解
C语⾔字符串数组详解C语⾔字符串数组字符串是连续的字符序列,最后以空字符'\0'作为终⽌符。
⼀个字符串的长度指所有字符的数量,但不包括终⽌符。
在 C 语⾔中,没有字符串类型,⾃然也就没有运算符以字符串为操作数。
字符串被存储在元素类型为 char 或宽字符类型数组中(宽字符类型指 wchar_t、char16_t 或 char32_t)。
宽字符组成的字符串也称为宽字符串(wide string)。
C 标准库提供了⼤量的函数,它们可以对字符串进⾏基本操作,例如字符串的⽐较、复制和连接等。
在这些传统的字符串函数以外,C11 新增了这些函数的“安全”版本,它们能确保字符串操作不会超出数组的边界。
可以使⽤字符串字⾯量来初始化任何字符类型数组。
例如,下⾯两个数组的定义是等价的:char str1[30] = "Let's go"; // 字符串长度:8;数组长度:30char str1[30] = { 'L', 'e', 't', '\'', 's',' ', 'g', 'o', '\0' };存储字符串的数组⼀定⽐字符串长度多⼀个元素,以容纳下字符串终⽌符(空字符'\0')。
因此,str1 数组能够存储的字符串最⼤长度是 29。
如果定义数组长度为 8,⽽不是 30,就会发⽣错误,因为它⽆法包含字符串终⽌符。
如果在定义⼀个字符数组时,没有显式地指定长度,但使⽤了字符串字⾯量来对它进⾏初始化,该数组的长度会⽐字符串长度多 1。
如下列所⽰:char str2[] = " to London!"; // 字符串长度:11 (注意开头的空格);// 数组长度:12下⾯的语句使⽤标准函数 strcat()把字符串 str2 附加到字符串 str1 的后⾯(str1 数组长度必须⾜够⼤以容纳连接后的全部字符)。
C语言程序设计(第八章)
的读写函数。 每次可从文件读出或向文件写入一个字符。
第八章
1.读字符函数fgetc()
fgetc() 函数的功能是从指定的文件中读一个字符,函
数调用的形式为:
字符变量 = fgetc(文件指针);
例如:
ch = fgetc(fp);
的意义是从打开的文件fp中读取一个字符并送入ch中 。
(1)字符读/写函数 :fgetc()/fputc()
(2)字符串读/写函数:fgets()/fputs()
(3)数据块读/写函数:freed/()fwrite()
(4)格式化读/写函数:fscanf()/fprinf()
以上函数原型都在头文件stdio.h中加以声明。
第八章
8.5.1字符读/写函数 :fgetc()/fputc()
关闭文件则断开指针与文件之间的联系,禁止再对该文
件进行操作。
第八章
8.3.1 文件打开的函数fopen()
open函数用于打开一个文件,其调用的一般形式为: 文件指针名 = fopen(文件名, 使用文件方式);
“文件指针名”:必须是被说明为FILE 类型的指针变量。
“文件名”:被打开文件的文件名,“文件名”是字符串常 量、字符数组或字符指针。 “使用文件方式”:指文件的类型和操作要求。
/* 输出系统提示信息 */
上面程序段的意义是,如果返回的指针为空,表示不能 打开test.dat文件,则给出提示信息“打开文件test.dat出 错!”,然后输出系统提示信息,当用户从键盘敲任一键后 执行exit(1)退出程序 。
第八章
8.3.2 文件关闭的函数fclose()
C语言程序设计教程第8章文件
8.2.1 文件的打开与关闭
2. 文件关闭函数fclose() 文件一旦使用完毕,为避免文件数据丢失等错误的发生, 可用文件关闭函数将其关闭。 函数调用的一般形式是: fclose(文件指针); 例如: fclose(fp); 正常完成关闭文件操作时,fclose()函数返回值为0, 如果返回非零值则表示有错误发生。
检查各种输入输出函数对文件进行读写时是否 出错,返回值为0表示未出错,否则表示有错。
8.2.2 文件检测与定位
2.文件的定位函数 在文件内部有一个位置指针,用来指向文件中当前被读写 的字节。 在文件打开时,该指针总是指向文件的第一个字节。 它不同于文件指针,文件指针是指向整个文件的,须在 程序中定义说明,只要不重新赋值,文件指针的值是不变的。 文件内部的位置指针是指示文件内部的当前读写位置, 比如每读写一次,该指针均会向后移动,它不需在程序中定 义说明,而是由系统自动设置的。
在stdio.h中定义了两个文件操作过程中经常用到的符号常量
8.2 文件操作
另外 在stdio.h中定义了两个文件操作过程中经常用到的符号常量 NULL:表示空指针,值为0 EOF: 表示文件末尾,值为-1 通过文件指针就可以完成对文件的操作 文件操作的过程一般有如下步骤:
1. 说明一个文件指针; 2. 通过文件名打开文件,并为文件指针赋值; 3. 通过文件指针对文件进行存取(即读或写操作) ; 4. 关闭文件。
8.2.1 文件的打开与关闭
1. 文件打开函数fopen()
文件在进行读写操作之前要先打开,使用完毕要关闭
所谓打开文件,实际上是建立文件的各种信息,并使 文件指针指向该文件,以便进行其它操作。 fopen()函数用来打开一个文件,其调用的一般形式为:
《C语言程序设计》教材习题答案第8章
一、选择题1.以下数组定义中,错误的是:C)int a[3]={1,2,3,4};2.以下数组定义中,正确的是:B) int a[][2]={1,2,3,4};3.设有定义“int a[8][10];”,在VC中一个整数占用4字节,设a的起始地址为1000,则a[1][1]的地址是:D)10444.已知有数组定义“int a[][3]={1,2,3,4,5,6,7,8,9};”,则a[1][2]的值是:C)65.在以下字符串定义、初始化和赋值运算中,错误的是:A) char str[10];str=”String”;6.设有以下字符串定义,char s1[]={‘S’,’t’,’r’,’i’,’n’,’g’};char s2[]=”String”;则s1和s2:C)长度不同,但内容相同。
7.设有定义“int a[10]={0};”,则说法正确的是:A)数组a有10个元素,各元素的值为0.8.设已定义“char str[6]={‘a’,’b’,’\0’,’c’,’d’,’\0’};”,执行语句“printf(“%s”,str)”后,输出结果为:B)ab9.引用数组元素时,数组元素下标不可以是:C)字符串10.已定义字符串S1和S2,以下错误的输入语句是:C)gets(s1,s2);11.下面程序段的运行结果是:A)123void main(){char a[]=”abcd”,b[]=”123”;strcpy(a,b);printf(“%s\n”,a);}12.下面程序段的运行结果是:A)123void main(){char a[]=”123”,b[]=”abcd”;if(a>b)printf(“%s\n”,a);else printf(“%s\n”,b);}二、编程题1.一维数字a的值已经,请把数组中的值按逆序存放,然后输出数组。
例如数组中原来的值为3,4,2,1,6,颠倒后变成6,1,2,4,3.#include<stdio.h>main(){int i,a[5]={2,3,45,12,5},t;printf("转换前:");for(i=0;i<5;i++)printf("%d\t",a[i]);for(i=0;i<5/2;i++){t=a[i];a[i]=a[5-i-1];a[5-i-1]=t;}printf("\n转换后:");for(i=0;i<5;i++)printf("%d\t",a[i]);}2.输入一个整数(位数不确定),从高位到低位依次输出各位数字,其间用逗号分隔。
C语言程序设计教程第8章北京邮电大学出版社.
第8章 指针
18
说明: 对于不同基类型的指针,指针变量“加上” 或“减去”一个整数n所移动的字节数(= sizeof( 指针所指对象的数据类型 ) )是不同的。 例如: float a[10], *p=a, *x; x=p+3; /*实际上是p加上3*4个字节赋给x, x依然指向数组的第三个分量*/
C语言程序设计教程
第 8 章 指针
8.1 8.2 8.3 8.4 8.5 8.6 指针与指针变量 指针与函数 指针与数组 指针与字符串 指针数组与命令行参数 程序举例
第8章 指针
2
8.1 指针与指针变量
8.1.1 指针的概念
1.内存与变量地址 内存地址:内存是计算机用于存储数据的存储 器,以一个字节作为存储单元,为了便于访问,给 每个字节单元一个唯一的编号,第一字节单元编号 为0,以后各单元按顺序连续编号,这些单元编号 称为内存单元的地址 。 变量地址:变量所分配存储空间的首字节单元 地址(字节单元编号)。
2018/9/14
C语言程序设计教程
第8章 指针
3
在程序中,对变量的操作实际上是通过地址来完成的。 • 定义时:定义变量→分配内存单元(按类型)→地址 (即内存中的编号) • 存取操作:程序 →变量名 →内存单元 →存取 • 实际上: 程序 →编译 →变量名 →变量的地址
2.访问方式
直接存取:把直接按变量名或地址存取变量值的方式 称为 “直接存取”方式。
2018/9/14
C语言程序设计教程
第8章 指针
10
8.1.3 指针运算
指针运算实际上是地址的计算,包括赋值运算、算术运算、 关系运算三种。
1. 指针的赋值运算 (1)将变量地址值赋给指针变量,使指针指向该变 量。
《C语言程序设计》课后习题答案第八章
8.1 编写两个函数,分别求两个证书的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果,两个整数由键盘输入。
void main(){ int Mgy(int x,int y);int Mgb(int z);int a,b,mgy,mgb;printf("请输入两个数:\n");scanf("%d,%d",&a,&b);mgy=Mgy(a,b);mgb=Mgb(a,b,mgy);printf("两个数的最大公约数为%d,最小公倍数为%d\n",mgy,mgb);}int Mgy(int x,int y){ int r,temp;if(x<y){ temp=x;x=y;y=temp;}while(x%y!=0){ r=x%y;x=y;y=r;}return y;}int Mgb(int x,int y,int z){ return (x*y/z);}8.2 求方程ax²+bx+c=0的根,用三个函数分别求当b²-4ac大于零、等于零和小于零时的根,8.3编写一个判素数的函数,在主函数输入一个整数,输出是否是素数的信息。
#include<math.h>void main(){ int Isprime(int a);int m,temp=0;printf("请输入一个数:\n");scanf("%d",&m);temp=Isprime(m);if(temp==0) printf("%d不是素数。
\n",m);else printf("%d是素数。
\n",m);}int Isprime(int a){ int i,k,flag;if(a==0||a==1) flag=0;else{ k=sqrt(a);for(i=2;i<=k;i++)if(a%i==0) flag=0; }return flag; }8.8 写一个函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字间空一格空8.9编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符8.10 写一个函数,输入一行字符,将此字符串中最长的单词输出。
c语言程序设计第五版课后答案谭浩强第八章课后答案
c语⾔程序设计第五版课后答案谭浩强第⼋章课后答案c语⾔程序设计第五版课后答案谭浩强习题答案第⼋章善于利⽤指针本章习题均要求使⽤指针⽅法处理。
1. 输⼊3个整数,要求按由⼩到⼤的顺序输出。
解题思路:先获取到三个变量的地址,然后获取三个数据,通过指针进⾏⽐较转换即可答案:#include <stdio.h>void swap(int *p_a, int *p_b){int temp = *p_a;*p_a = *p_b;*p_b = temp;}int main(){int a, b, c, *p_a = &a, *p_b = &b, *p_c = &c; // 获取每个变量空间的地址printf("Please enter three numbers:");scanf_s("%d%d%d", p_a, p_b, p_c);if (*p_a > *p_b) {swap(p_a, p_b);//通过指针进⾏指向空间内的数据交换}if (*p_a > *p_c) {swap(p_a, p_c);}if (*p_b > *p_c) {swap(p_b, p_c);}printf("%d %d %d\n", *p_a, *p_b, *p_c);system("pause");return 0;}2. 输⼊3个字符串,要求按由⼩到⼤的顺序输出。
解题思路:字符串的⽐较可以使⽤strcmp函数,返回值>0表⽰⼤于,返回值⼩于0表⽰⼩于,返回追等于0表⽰相同。
其他的⽐较排序思路与数字的排序交换没有区别,逐个进⾏⽐较先找出最⼤的,然后找出第⼆⼤的。
答案:#include <stdio.h>int main(){char str[3][32];char *p[3];printf("Please enter three strings:");for (int i = 0; i < 3; i++) {p[i] = str[i];scanf_s("%s", p[i], 32);//后边的数字限制缓冲区边界,防⽌缓冲区溢出访问越界}//让p[0]和p[1]/p[2]分别进⾏⽐较,找出最⼤的字符串,i+1之后,则让p[1]和p[2]进⾏⽐较,找出第⼆⼤//i循环总个数-1次,最后⼀个是不需要⽐较的for (int i = 0; i < 2; i++) {for (int j = i + 1; j < 3; j++) {if (strcmp(p[i], p[j]) > 0) {char *tmp = p[i]; p[i] = p[j]; p[j] = tmp;}}}printf("%s %s %s\n", p[0], p[1], p[2]);system("pause");return 0;}3. 输⼊10个整数,将其中最⼩的数与第⼀个数对换, 把最⼤的数与最后⼀个数对换。
C语言,第8章 数组(字符数组)
(字符数组)
内 容 提 要
• • • • • • • •
•
• •
什么是字符串? 字符数组的作用 字符数组的定义 字符数组的输入和输出 字符数组的初始化 程序实例 字符串复制函数strcpy 字符串连接函数strcat 字符串比较函数strcmp 字符串长度函数strlen 程序实例
什么是字符串?
给字符数组赋值
例如:
char c[]={“boy”}; char c[]=“boy”; char c[]={„b‟, „o‟, „y‟, „\0‟};
赋值后字符数组c在内存中的状态:
c[0] b c[1] c[2] o y c[3] \0
给字符数组赋值
• 从键盘输入:
•
例如:: 使用循环逐个字符输入 #include <stdio.h> int main(void) { char c[20]; int i; for (i=0; i<3; i++) { scanf(“%c”, &c[i]); } c[i] = „\0‟; …….. return 0;
输出结果
printf(“zimu=%d,shuzi=%d,kongge=%d,qita=%d\n",
zimu, shuzi, kongge, qita);
return 0; }
使用字符串处理函数必须加头文件 <string.h>
字符串复制函数strcpy
1. strcpy(字符数组1,字符串2) 作用:将字符串2复制到字符数组1中去。
例如:输入 My name is chdong!
遇到第一个空格结束,因此只输入 My
字符数组的输出
C语言程序设计教程 杨路明 答案第8章
}
9、
/*输入n个数,并排序后输出。*/
#include<stdio.h>
#include<string.h>
int *paixu(int data[],int n)
{ int i,*p1,*p2,temp;
p1=data;
for(p1=data;p1<data+n-1;p1++)
printf("Please input a string: ");
gets(a);
p=a;q=b;
printf("\n\nPlease input m and n(like 1,1): ");
scanf("%d,%d",&m,&n);
if( (strlen(a)>=m) && ((strlen(a)-m+1)>=n) )/*复制的位置要符合要求*/
#include<stdio.h>
void main()
{
int a[100],temp1=0,temp2=0,max=0,min=0,k;
printf("\nPlease input 8 ge shu: ");
for(k=0;k<8;k++)
{ scanf("%d",&a[k]);
{
t=(int)(*p-48);
a[i]=a[i]*10+t;
p++;
if((*p)>'9'||(*p)<'0')
C语言程序设计第八章 指针的使用
第八章指针的使用【学习目标】本章将详细介绍在C语言中如何使用指针。
学习要点包括如下几点:(1)掌握指针和指针变量的概念,了解指针变量的特点以及直接访问数据和间接访问数据的原理。
(2)掌握指针变量的定义、赋值方法及指针运算符的使用,熟练运用指针访问简单变量。
(3)熟悉指针和一维数组的关系,掌握指向一维数组的指针变量的定义方法,熟练使用指针变量访问一维数组元素。
(4)了解指针与字符串的关系,能熟练使用指针处理字符串。
(5)熟练掌握用指针变量作函数的参数时函数的定义和调用方法、数组名作函数的参数用法。
(6)指向指针的指针的运用。
【学习导航】本章的在整个课程中的位置如图5-1所示。
图8-1 本章学习导航在本书的第一章介绍C语言有一个灵活性的特点,那么它的灵活性具体体现在哪里呢?其实就是指针。
指针是C语言的精华部分,通过利用指针,我们能很好地利用内存资源,使其发挥最大的效率。
有了指针技术,我们可以描述复杂的数据结构,对字符串的处理可以更灵活,对数组的处理更方便,使程序的书写简洁,高效。
8.1 地址和指针指针是C语言的一种数据类型,类似于整型、字符型等。
既然指针也是一种类型,那么也可以定义该类型的变量,称为指针变量。
指针变量和其他类型的变量的区别是:指针变量存储的是地址。
所以要学好指针,就一定要明白数据在内存中是如何存储的。
计算机所有数据都是存储在存储器里,系统的内存可看作编了号的小房间,如果要取房间的东西(读取数据)就需要得到房间编号。
地址就是内存区中对每个字节的编号。
下面通过两个整型变量来说明。
整型变量x、y(基本整型需4个字节)在内存中的存储如图8-2所示(假设内存编号是从2000开始)。
把变量所占用的存储单元首字节的地址作为变量的地址。
C语言中利用取地址运算符“&”获取变量的存储地址。
例如,&c将返回c的首地址;&x将返回x的首地址。
2000H2004H2008H2012H...图8-2 变量x和y在内存中的存储图8-2中2000H和2004H就是内存单元的地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十一章字符串1 D解析:字符串在C语言中年干存储时,应该用数组或者是指针进行存储数据。
A选项中str为数组,但是后面的赋值的对象中的’\064’为一个字符,不能构成一个字符串,字符串必须有一个结束符,即:’\0’。
故A答案是错误的。
B答案中的str为一个字符变量,变量不能用来存储字符串。
故B选项是错误的。
C答案同理。
只有D答案中符合字符串的定义规则。
2 A解析:A选项中ss[1]可以看作是一个地址常量,其值不能改变,所以不可以对其赋值。
但是在定义二维数组的时候,对其进行初始化是允许的,如选项B。
选项C中定义的值指针数组,数组中的每一个元素都是指针,所以ss[1]代表的是一个指针,所以指针可以指向一个字符串,即让该指针变量指向该字符串。
选项D中的ss为一个指针数组,所以指针数组中元素都为指针,此时为让该变量指向了“right?”字符串。
3 A解析:str是地址常量,p是指针变量,两者类型不一致,选项B错误。
str 数组的长度是20,而p所指的字符串遇到’\0’就结束,本题中其长度应该为7,选项C错误。
同理,既然str数组的长度与p所指字符串长度不同,所以D答案中的str中的内容为在存储字符串以后的后面为13个‘\0’。
p的内容为:7个有效字符。
4 C解析:对于数组p,只有三个元素,分别是’a’,’b’,’c’,所以sizeof(p)的输出结果应该是3 ,对于数组q,存储了四个元素,分别是’a’,’b’,’c以及’\0’。
所以 sizeof(q)的输出结果是4。
5 C解析:对于数组a,只有四个元素,分别是’x’,’y’,’z’ 以及’\0’,所以sizeof(a)的输出结果应该是4,对于数组b,存储了三个元素,分别是’x’,’y’,’z’。
所以 sizeof(b)的输出结果是3。
所以数组a 的长度大于b 数组的长度。
6 C解析:数组a中存储了7个字符,分别是’a’,’0’,’\0’,’0’,’a’,’0’,’\0’,当使用sizeof(a)统计计数的时候,会统计计算这7个字符,但是当用strlen(a)统计数组元素个数的时候,遇到’\0’的时候就会结束,所以最终的输出结果是7 2 。
7 B解析:ps=s语句使ps指向数组s的首地址,即指向元素a,对于表达式*p+4,由于*的优先级高于+,所以进行间接访问运算,*p得到a,再+4,根据ASCII码的顺序,最后的输出结果应该是e,答案为B。
8 B解析:选项A的getc()函数完成的是从文件中读入一个字符,而不是题目所要求的从键盘读入一个字符串,错误。
选项C的getchar()函数每次读入的是一个字符变量,而不是字符串,错误。
选项D的scanf()函数,通过格式控制符%s可以读入字符串变量,但是遇到空格会作为输入数据的分隔符,不会被作为数据读入。
选项B :gets()函数的功能是从键盘中获得一个字符串,并且在获得字符串的时候可以接受空格字符。
9 D解析:选项A中的参数2的类型应该为指针或者是地址,x[4]为一个数组中的元素,数据类型不匹配,应改为&x[4],选项B中的y是数组名,为常量,不能进行++运算,错误。
选项C中参数1对应的数组长度小于参数2的数组长度,错误。
故只有D答案的结果正确。
10 B解析:strlen()函数统计字符串长度的时候,是在遇到’\0’的时候结束统计。
所以对于数组q来说,定义了数组的长度为10,并给前三个字符赋了初值,则从第4个字符开始,系统将数组元素的值置为’\0’,所以strlen(q)的结果是3 。
而对于数组p来说,数组长度为3,但是何时遇到’\0’无法确定,所以strlen(p)的值也无法确认。
11 D解析:函数f(char *p[],int n)完成的功能就是对字符串进行字典排序,所谓的字典顺序就是根据字母的大小顺序,strcmp函数中的功能是:将两个字符串进行比较,比较的原则是从第一个字符开始,如果第一个字符串相同的话,进行第二个字符的比较,一直往后,如果第一个字符不相同的话,直接返回第一个字符减第二个字符的值。
在f函数中的语句为两个for循环的嵌套。
那么执行过程为:1) i=0,i<4真值,执行内循环。
\j=1;j<5真值,执行后的结果为p[0]=”aabdfg”,p[1]=”abc”.j++后,j=2;j=2;j<5 真值,执行后的结果为p[0]= ”aabdfg”,p[2]=”abbd”,j++后,j=3;j=3;j<5 真值,执行后的结果为p[0]= ”aabdfg”,p[3]=”dcdbe”,j++后,j=4;j=4; j<5 真值,执行后的结果为p[0]= ”aabdfg”,p[4]=”cd”,j++后,j=5;j=5; j<5 假值。
i++后变量的值为12)i=1,i<4真值,执行内循环。
j=2;j<5 真值,执行后的结果为p[1]= ” abbd”,p[2]=” abc”, j++后,j=3;j=3;j<5 真值,执行后的结果为p[1]= ” abbd”,p[3]=”dcdbe”,j++后,j=4;j=4; j<5 真值,执行后的结果为p[1]= ” abbd”,p[4]=”cd”, j++后,j=5;j=5; j<5 假值。
i++后变量的值为23)i=2,i<4真值,执行内循环。
j=3;j<5 真值,执行后的结果为p[2]= ” abc”,p[3]=”dcdbe”,j++后,j=4;j=4; j<5 真值,执行后的结果为p[2]= ” abc”,p[4]=”cd”, j++后,j=5;j=5; j<5 假值。
i++后变量的值为34)i=3, i<4真值,执行内循环。
j=4; j<5 真值,执行后的结果为p[3]= ” cd”,p[4]= ”dcdbe”, j++后,j=5;j=5; j<5 假值。
i++后变量的值为45) i=4, i<4假值,退出循环。
最后strlen(p[1])的值为:4。
12 A解析:*运算符和++运算符的优先级相同,且结合方向都是自右向左,所以在进行运算时,先计算++的值,再计算*的值,p=s,p指向了字符串中的第一个元素。
即‘1’。
第一个*p++的计算为:变量p往后指一个位置,即指向了变量‘5’。
表达式p++的值为变量原来的值,即指向的还是‘1’,所以*p++得到的值为‘1’。
所以最后的输出的结果的1。
第二个表达式的*p++,由于在前面的运算中,p指向了字符变量‘5’。
*p++的计算为:变量p往后指一个位置,即指向了变量‘9’。
表达式p++的值为变量原来的值,即指向的还是‘5’,所以*p++得到的值为‘5’。
所以最后的输出的结果的5。
13 D解析:该题中的while语句中的功能是在a所指的字符串不结束,b所指的字符串不结束,同时两个字符串所指的字符的都相同时,继续往后判断,直到两个字符不相同,或者是其中的一个字符串结束时,退出该循环,所以最后返回的两个所对应位置上的字符的AscII值,功能和strcmp()功能是相同的。
所以选择答案D。
14 A解析: point()函数传递的是指针变量的值,而不是指针变量本身的地址,仍然是一个传值而不是传地址的过程,实参的值没有改变,所以指针p仍然指向字符串的首地址,输出结果为a。
15 D解析:比较字符串大小的时候,应该调用函数strcmp(),而不是直接进行比较,选项A错误。
对于选项B,只要s1和s2不相等,无论s1所指串是大于或是小于s2所指串,其结果非0(真值),都会执行语句S,与题意不符,错误。
选项C的函数实参顺序错误。
16 B解析:对于二维数组,每一行中含有的元素的个数为:10。
第二行的首元素是接着第一行的最后一个元素的。
所以p+10是指向字符串“Beijing”字符串的首地址,所以正确答案是B。
17 D解析:对于格式控制符%s,在输出的时候遇到’\0’才结束输出。
即输出的是一个字符串。
执行循环。
1) p=s+1;p<s+4为真值,输出的结果为:BCD。
p++后,p指向了‘C’。
2) p<s+4为真值,输出的结果为: CD。
p++后,p指向了‘D’。
3) p<s+4为真值,输出的结果为: D。
p++后,p指向了‘\0’。
4) p<s+4为假值,退出该循环。
18 B解析:gets()函数需要的参数是指针类型的。
所以ACD都满足条件,答案B中的a[0]是数组中的元素,是一个字符,不是指针类型,错误。
19 A解析:char *p[4],即定义一个指针数组,数组中的每一个元素都为指针,p[4]指向的是下标为4的这一个字符串。
即:指向的是第5个字符串的首地址,即字符串“cd”,所以strlen(p[4])的结果是2。
20 C解析:数组名是指针常量,不能对其进行整体赋值和整体使用,所以选项C错误,需要注意一点:在定义字符数组的时候可以初始化,如选项A。
21 C解析: char *s1=”abc”,即定义了一个指针变量s1,并且s1指向的是这个字符串的第一个元素,即指向了字符‘a’。
同样的s2指向了字符‘1’。
swap 函数中的语句的功能是交换变量*x和*y两个变量的值,则最后输出的结果为s1所指的字符串的内容为:1bc,s2所指的字符串的内容为:a23。
22 B解析:fun函数统计首字符是’T’的字符串的个数,所以符合条件的有”Tue”和”Thu”,输出结果为2.fun函数中的功能为:1) i=0;i<7;p[i][0]==’T’为假值,n=0;i++。
变量i的值为1;2)i=1;i<7;p[i][0]==’T’为真值,n=1;i++。
变量i的值为2;3)i=2;i<7;p[i][0]==’T’为假值,n=1;i++。
变量i的值为3;4)i=3;i<7;p[i][0]==’T’为真值,n=2;i++。
变量i的值为4;5)i=4;i<7;p[i][0]==’T’为假值,n=2;i++。
变量i的值为5;6)i=5;i<7;p[i][0]==’T’为假值,n=2;i++。
变量i的值为6;7)i=6;i<7;p[i][0]==’T’为假值,n=2;i++。
变量i的值为7;8)i=7;i<7;假值。
退出循环。
所以最后输出的是fun(str)即返回的就是n的值,即2.23 A解析:fun1函数中的(*q)++将指针q所指向的字符进行一次自加运算,所以输出结果为A.p=&a[3],即变量p得到的是字符‘g’的首地址。
(*q)++代表的是,先计算出*q的值,然后计算变量的自加。
执行循环:1)*q!=’\0’为真值,(*q)++得到的结果为h,q++,指向了字符‘r’.2) *q!=’\0’为真值,(*q)++得到的结果为s,q++,指向了字符‘a’.3) *q!=’\0’为真值,(*q)++得到的结果为b,q++,指向了字符‘m’.4) *q!=’\0’为真值,(*q)++得到的结果为n,q++,指向了字符‘\0’.5) *q!=’\0’为假值,退出循环。