字符串处理
- 格式:doc
- 大小:198.00 KB
- 文档页数:24
编程语言中的字符串处理技巧在计算机编程中,字符串是一种非常常见的数据类型。
字符串处理是编程中一个非常重要的技巧,它涉及到对字符串的创建、拼接、切割、替换等操作。
不同的编程语言提供了各种各样的字符串处理函数和方法,本文将介绍一些常用的字符串处理技巧。
1. 字符串的创建和拼接在大多数编程语言中,字符串可以通过使用引号将一系列字符括起来来创建。
例如,在Python中,可以使用单引号或双引号创建字符串:`str1 = 'Hello'` 或 `str2= "World"`。
还可以使用加号(+)将两个字符串拼接在一起:`str3 = str1 + str2`,此时`str3`的值将是`HelloWorld`。
2. 字符串的长度和索引在处理字符串时,经常需要获取字符串的长度和访问其中的字符。
大多数编程语言提供了函数或方法来获取字符串的长度,例如,在Python中,可以使用`len()`函数:`length = len(str1)`。
字符串中的字符可以通过索引来访问,索引从0开始,例如,`str1[0]`将返回字符串`str1`的第一个字符。
3. 字符串的切割和连接在处理字符串时,有时需要将字符串按照特定的分隔符进行切割或连接。
在Python中,可以使用`split()`函数将字符串按照指定的分隔符切割成一个列表,例如:`str4 = "Hello World".split(" ")`,此时`str4`将是一个包含两个元素的列表:`["Hello", "World"]`。
相反,可以使用`join()`函数将一个列表中的字符串连接成一个字符串,例如:`str5 = "-".join(["Hello", "World"])`,此时`str5`将是`Hello-World`。
c语言字符串的简单处理C语言字符串的简单处理在C语言中,字符串是一种常见的数据类型,用于存储字符序列。
在程序中,我们经常需要对字符串进行一些简单的处理,例如字符串的拼接、查找特定字符、计算字符串的长度等操作。
本文将介绍一些常用的字符串处理方法,帮助读者更好地理解和应用C语言中的字符串操作。
一、字符串的定义和初始化在C语言中,字符串是由字符组成的字符数组。
我们可以通过以下两种方式来定义和初始化字符串:1. 使用字符数组方式定义和初始化字符串:char str1[] = "Hello World";2. 使用指针方式定义和初始化字符串:char *str2 = "Hello World";二、字符串的输出和输入在C语言中,我们可以使用printf函数来输出字符串,使用scanf 函数来输入字符串。
1. 输出字符串:printf("%s\n", str1);2. 输入字符串:scanf("%s", str1);需要注意的是,在使用scanf函数输入字符串时,需要保证输入的字符串长度不超过定义的字符数组长度,否则会发生溢出错误。
三、字符串的拼接在C语言中,我们可以使用strcat函数来实现字符串的拼接。
1. 使用strcat函数拼接字符串:char str3[20] = "Hello";char str4[] = "World";strcat(str3, str4);printf("%s\n", str3); // 输出结果为"HelloWorld"需要注意的是,在使用strcat函数拼接字符串时,需要保证目标字符数组长度足够大,以避免发生溢出错误。
四、字符串的复制在C语言中,我们可以使用strcpy函数来实现字符串的复制。
1. 使用strcpy函数复制字符串:char str5[20];char str6[] = "Hello World";strcpy(str5, str6);printf("%s\n", str5); // 输出结果为"Hello World"需要注意的是,在使用strcpy函数复制字符串时,需要保证目标字符数组长度足够大,以避免发生溢出错误。
8种C语言基本常用的字符串处理函数8种C语言基本常用的字符串处理函数本文是店铺搜索整理的8种基本的常用的字符串处理函数,所有的C语言编译系统中一般都提供这些函数,以下是店铺为大家整理的8种C语言基本常用的字符串处理函数,仅供参考,希望能够帮助到大家。
1、puts函数——输出字符串的函数一般的形式为puts(字符串组)作用:将一个字符串输出到终端。
如,char一个string,并赋予初值。
调用puts(string);进行字符串的输出。
2、gets函数——输入字符串的函数一般的形式:gets(字符数组)作用:从终端输入一个字符串到字符数组,并且得到一个函数值成为字符数组的起始地址。
gets(str);键盘输入,,,,你懂得。
注意:puts和gets函数只能输出或者输入一个字符串。
3、strcat函数——字符串连接函数一般的形式:strcat(字符数组1,字符数组2);作用:把两个字符串数组中字符串连接起来,把字符串2连接到字符串1的后面。
说明:字符数组1必须足够大,以便容纳连接后的新字符串。
4、strcpy/strncpy函数——字符串复制函数一般形式:strcpy(字符数组1,字符串2);作用:将字符串2复制到字符数组1中去。
如:char str1[10],str2[]="DongTeng";strcpy(str1,str2);执行后的结果为:你懂得注意:1. 不能用赋值语句直接将一个字符串常量或者字符数组直接给一个字符数组。
2. 用strncpy可以赋值指定的位置的字符。
strncpy(str1,str2,3);将str2中的第3个字符复制到str1中。
5、strcmp函数——字符串比较函数一般形式:strcmp(字符串1,字符串2);作用:用来比较两个字符串的差异。
具有不同的比较规则。
6、strlen函数——测字符串长度的函数一般形式:strlen(字符数组);如:char str[10]="DongTeng";printf("%d",strlen(str));得到的结果是:57、strlwr函数——转换为小写的函数一般形式:strlwr(字符串);8、strupr函数——转换为大写的函数一般形式:strupr(字符串)。
(个人收集学习笔记)4字符串处理与正则表达式第四章字符串处理与正则表达式一、字符串处理介绍1、如果字符串处理函数和正则表达式都可以实现字符串操作,建议使用字符串处理函数,因为效率高。
2、因为PHP 是弱类型语言,所以其他类型的数据一般都可以直接应用于字符串操作函数里,而自动转换成字符串类型进行处理。
3、还可以将字符串视为数组,或当作字符集合来看待。
$str[0]$str{0}二、常用的字符串输出函数1、echo()函数:使用它的效率要比其他字符串输出函数高。
2、print()函数:功能和echo()一样,但它有返回值,成功返回1,不成功返回0。
3、die()函数:exit()函数的别名。
1)参数如果是字符串,则该函数会在退出前输出它。
2)如果参数是一个整数,这个值会被用做退出状态。
值在0-254之间,退出状态255由PHP 保留,不会使用。
状态0用于成功终止程序。
4、printf():用于输出格式化字符串。
1)例子:printf(“%s age is $d”,$str,$num);2)%d :带符号十进制数%u :无符号十进制数%f :浮点数%s :字符串%b :二进制数%c :依照ASCII 值的字符%%:返回百分比符号%o :八进制数%x :十六进制数(小写字母)%X :十六进制数(大写字母)3)如果%符号多于arg 参数,则必须使用占位符。
占位符被插入到%符号之后,由数字和\$组成。
如:printf(“The %2\$s book contains %1\$d pages.That’s a nice %2\$s full of %1\$d pages”,$num,$str);%2\$s 代表$str 。
5、sprintf()函数:用法和printf()一样,但它不是输出字符串,而是把格式化的字符串以返回值的形式写入到一个变量中。
三、常用的字符串格式化函数字符串的格式化就是将字符串处理为某种特定的格式。
C语言字符串处理掌握字符串的输入输出和处理函数C语言字符串处理:掌握字符串的输入输出和处理函数在C语言中,处理字符串是十分重要的。
字符串是一系列字符的集合,在程序中广泛应用于文本处理和数据操作。
掌握字符串的输入输出和处理函数对于编写高效的C语言程序至关重要。
本文将介绍C语言中字符串的输入输出和一些常用的字符串处理函数。
一、字符串的输入输出1. 字符串的输入在C语言中,我们可以使用scanf函数来读取字符串的输入。
需要注意的是,由于scanf遇到空格、制表符或换行符时会停止读取,因此无法直接读取带有空格的字符串。
为了读取完整的字符串,我们可以使用fgets函数。
```c#include <stdio.h>int main() {char str[100];printf("请输入一个字符串:");fgets(str, sizeof(str), stdin);printf("您输入的字符串是:%s\n", str);return 0;}```上述代码中,我们定义了一个大小为100的字符数组str,并使用fgets函数从标准输入读取字符串。
其中sizeof(str)用于指定最大读取的字符数。
2. 字符串的输出在C语言中,我们可以使用printf函数来输出字符串。
需要注意的是,如果字符串中包含格式控制符(如%),需要使用转义字符%来表示。
```c#include <stdio.h>int main() {char str[] = "Hello, World!";printf("字符串输出示例:\n");printf("%s\n", str);return 0;}```上述代码中,我们定义了一个包含字符串"Hello, World!"的字符数组str,并使用printf函数输出该字符串。
C语言字符串处理方法汇总C语言是一种广泛应用于计算机编程的编程语言,而字符串是计算机编程中常用的数据类型。
在C语言中,字符串是由一系列字符组成的数组。
本文将汇总一些常用的C语言字符串处理方法,帮助读者更好地掌握字符串操作。
1. 字符串的声明和初始化在C语言中,可以使用字符数组来表示字符串。
字符串的声明和初始化可以通过以下方式进行:```char str1[] = "Hello, World!"; // 使用字符数组进行声明和初始化char str2[20] = "Hello, C"; // 定义长度为20的字符数组,并初始化为"Hello, C"```2. 字符串的输入和输出在C语言中,可以使用`scanf`函数和`printf`函数来进行字符串的输入和输出。
下面是一个示例:```char str[50];printf("请输入字符串:");scanf("%s", str);printf("你输入的字符串是:%s\n", str);```3. 字符串的拷贝在C语言中,可以使用`strcpy`函数来进行字符串的拷贝。
下面是一个示例:```char source[] = "Hello, World!";char destination[20];strcpy(destination, source);printf("拷贝后的字符串是:%s\n", destination);```4. 字符串的连接在C语言中,可以使用`strcat`函数来进行字符串的连接。
下面是一个示例:```char str1[20] = "Hello,";char str2[] = " World!";strcat(str1, str2);printf("连接后的字符串是:%s\n", str1);```5. 字符串的比较在C语言中,可以使用`strcmp`函数来进行字符串的比较。
高级字符串处理技巧使用sed和awk进行字符串替换和处理在计算机编程中,字符串处理是一项非常重要的技能,而使用sed 和awk工具可以帮助我们更加高效和灵活地处理字符串。
本文将介绍sed和awk的基本用法以及一些高级的字符串处理技巧。
一、sed工具sed(Stream Editor)是一个流编辑器,能够对文本进行一行一行的处理,常用于替换、删除、插入字符串等操作。
1. 替换字符串sed命令的替换字符串功能非常强大,格式为:```sed 's/要替换的字符串/新的字符串/g' 文件名```其中,`s`代表substitute,字符串被替换的标志是`/`,`g`表示进行全局替换。
例如,我们要将文件file.txt中的所有"apple"替换为"orange",可以使用以下sed命令:```sed 's/apple/orange/g' file.txt```2. 删除特定行sed还可以删除文件中的特定行,常用的命令是`d`,例如:```sed '2d' file.txt```上述命令将删除文件file.txt中的第二行。
3. 插入字符串sed可以在文件的某一行前或某一行后插入字符串,分别使用命令`i`和`a`。
例如:```sed '2i\This is a new line' file.txt```上述命令将在文件file.txt的第二行前插入"This is a new line"。
二、awk工具awk是一种强大的文本处理工具,它可以用于查找、提取和处理文件中的数据。
它将文件按行分割成字段,通过指定的条件和操作来处理这些字段。
1. 提取特定字段awk默认将每一行的字段分割成为$1、$2、$3...,我们可以使用这些变量来提取特定字段。
例如,提取文件file.txt中的第一列可以使用以下命令:```awk '{print $1}' file.txt```2. 使用条件进行处理awk可以根据条件来处理数据,其中,使用`pattern { action }`的格式。
数据清洗与整理中的字符串处理与匹配技巧在数据分析和处理的过程中,我们常常需要对原始数据进行清洗和整理,以便后续的分析和建模。
而字符串处理和匹配技巧在数据清洗与整理过程中扮演着重要的角色,下面将介绍一些常用的技巧和方法。
一、字符串清洗1. 去除空格和特殊字符在数据中,字符串常常包含各种空格和特殊字符,这会干扰我们进行有效的匹配和处理。
可以使用strip()函数去除字符串前后的空格,replace()函数去除指定的特殊字符。
2. 大小写转换在数据清洗过程中,经常需要统一字符串的大小写形式以便匹配。
可以使用upper()函数将字符串转换为大写形式,或者使用lower()函数将字符串转换为小写形式。
3. 字符串拼接有些情况下,我们需要将多个字符串拼接成一个字符串,可以使用"+"符号进行拼接,或者使用join()函数将多个字符串连接起来。
二、字符串匹配1. 正则表达式匹配正则表达式是一种强大的字符串匹配工具,可以用来匹配、查找和替换特定模式的字符串。
例如,可以使用\d匹配任意一个数字字符,\w匹配任意一个字母或数字字符,\s匹配任意一个空白字符等。
通过正则表达式,可以方便地筛选出符合特定模式的字符串。
2. 字符串查找和提取在数据清洗和整理中,我们有时需要查找字符串中是否包含特定的子串,或者提取出子串的内容。
可以使用in关键字来查找某个子串是否在字符串中存在,或者使用find()函数来查找子串的位置。
如果需要提取出符合条件的子串,可以使用split()函数或者正则表达式的group()函数。
三、字符串处理技巧1. 字符串切片字符串切片是指根据索引位置对字符串进行分割,可以通过切片的方式截取出需要的子串。
例如,可以通过str[start:end]的方式截取从start到end-1位置的子串。
2. 字符串替换有时候我们需要将字符串中的某个子串替换成另一个字符串,可以使用replace()函数来进行替换。
Java基础篇--字符串处理(StringBuffer)字符串处理在Java中最常将字符串作为String类型对象来处理。
同时String中也提供了很多操作字符串的函数(可⾃⾏查阅资料),⽽本篇将介绍StringBuffer如何操作字符串。
StringBuffer是使⽤缓冲区的,本⾝也是操作字符串的,但与String类不同,String类中的内容⼀旦声明之后不可改变,改变的只是其内存地址的指向,⽽StringBuffer中的内容是可以改变的,对于StringBuffer⽽⾔,本⾝是⼀个具体的操作类,所以不能像String那样采⽤直接赋值的⽅式进⾏对象实例化,必须通过构造⽅法完成。
StringBuffer连接字符操作当⼀个字符串的内容需要被经常改变时就要使⽤StringBuffer在StringBuffer中使⽤append()⽅法,完成字符串的连接操作实例操作⼀:字符串连接操作(append)代码:package字符串处理;public class StringBufferDemo01{public static void main(String args[]){StringBuffer buf = new StringBuffer() ; // 声明StringBuffer对象buf.append("Hello ") ; // 向StringBuffer中添加内容buf.append("World").append("!!!") ; // 可以连续调⽤append()⽅法buf.append("\n") ; // 添加⼀个转义字符buf.append("数字 = ").append(1).append("\n") ; // 添加数字buf.append("字符 = ").append('C').append("\n"); // 添加字符buf.append("布尔 = ").append(true) ; // 添加布尔值System.out.println(buf) ; // 直接输出对象,调⽤toString()}};打印结果:Hello World!!!数字 = 1字符 = C布尔 = true实例操作⼆:字符串添加内容(insert)public class StringBufferDemo03{public static void main(String args[]){StringBuffer buf = new StringBuffer() ; // 声明StringBuffer对象buf.append("World!!") ; // 添加内容buf.insert(0,"Hello ") ; // 在第⼀个内容之前添加内容System.out.println(buf) ;buf.insert(buf.length(),"偶my耶~") ; // 在最后添加内容System.out.println(buf) ;}};打印内容Hello World!!Hello World!!偶my耶~实例操作三:字符串反转(reverse)package字符串处理;public class StringBufferDemo04{public static void main(String args[]){StringBuffer buf = new StringBuffer() ; // 声明StringBuffer对象buf.append("World!!") ; // 添加内容buf.insert(0,"Hello ") ; // 在第⼀个内容之前添加内容String str = buf.reverse().toString() ; // 将内容反转后变为String类型System.out.println(str) ; // 将内容输出}};打印内容:!!dlroW olleH实例操作四:替换字符串指定内容(replace)public class StringBufferDemo05{public static void main(String args[]){StringBuffer buf = new StringBuffer() ; // 声明StringBuffer对象buf.append("Hello ").append("World!!") ; // 向StringBuffer添加内容buf.replace(6,11,"偶my耶") ; // 将world的内容替换System.out.println("内容替换之后的结果:" + buf) ; // 输出内容}};打印内容:内容替换之后的结果:Hello 偶my耶!!实例操作五:字符串截取(substring,delete)package字符串处理;public class StringBufferDemo06{public static void main(String args[]){StringBuffer buf = new StringBuffer() ; // 声明StringBuffer对象buf.append("Hello ").append("World!!") ; // 向StringBuffer添加内容buf.replace(6,11,"偶my耶") ; // 将world的内容替换String str = buf.substring(6,11) ; // 截取指定范围的内容// String str = buf.delete(6,11).toString() ;// 删除指定范围中的内容System.out.println(buf);System.out.println("内容替换之后的结果:" + str) ; // 输出内容}};打印结果Hello 偶my耶!!内容替换之后的结果:偶my耶!实例操作六:查找指定内容(indexOf)package字符串处理;public class StringBufferDemo08{public static void main(String args[]){StringBuffer buf = new StringBuffer() ; // 声明StringBuffer对象buf.append("Hello ").append("World!!") ; // 向StringBuffer添加内容if(buf.indexOf("Hello")==-1){System.out.println("没有查找到指定的内容") ;}else{ // 不为01表⽰查找到内容System.out.println("可以查找到指定的内容") ;}}};打印内容可以查找到指定的内容在StringBuffer中还有许多的函数就不⼀⼀介绍了!想要更深去了解可查阅相关资料,下⾯介绍⼀个使⽤String和StringBuffer来操作字符串的案列案列之⼩写⾦额变⼤写⾦额package com.lh.bean;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class StringUtil {private String money; //转换之前的数字⾦额private String submoneyCN[]={"","拾","佰","仟"}; //表⽰数字位数的数组private String numberCNN[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; //⼤写数字的数组private String je="零壹贰叁肆伍陆柒捌玖"; //⼤写的数字(0-9)private String cdw="万仟佰拾亿仟佰拾万仟佰拾元⾓分"; //⾦额单位public StringUtil(){} //默认的构造⽅法public void setMoney(String money){this.money=money;}public String getMoney(){return convert(this.money);}/*** 转换数字⾦额为⼤写⾦额* @return返回转换后的⼤写⾦额*/public String convert(String money){String formatCN="";int point=money.indexOf("."); //判断字符串是否包含⼩数点if(point!=-1){String money1=money.substring(0,point); //⼩数点之前的部分String money1_1=(new StringBuffer(money1).reverse()).toString();//字符串倒序String money2=money.substring(point+1); //⼩数点之后的部分if(money2.length()<2){ //如果⼩数点后的部分少于两位,⽤"0"补齐if(money2.length()==0)money2="00";elsemoney2+="0";}else//如果⼩数点后的位数⼤于2位,则只前2位money2=money.substring(point+1,point+3);int len = money1_1.length(); //字符串反转之后,⼩数点之前的字符位数int pos=len-1;String sigle="";boolean allhavenum=false;boolean havenum=false;boolean mark=false; //设置⼀个开关变量,若当前数为"0",将该值设为true;不为"0"时设为false/**以下代码为读出⼩数点左⾯的部分*/while(pos>=0){sigle=money1_1.substring(pos,pos+1);//截取1位数字,⽐如数字1234.56,将左侧的字符串反转,值为4321,则截取的值为1 /**读取“亿单元”的代码。
课程设计任务书学生姓名:专业班级:指导教师:张素文工作单位:自动化学院题目: 字符串处理初始条件:从键盘输入一个以回车结束的十进制数字串(不超过20 个)。
(1)按 ASCII 码值的降序显示这个数字串中ASCII 码值最大和最小的两个数字。
(2)以十进制形式显示数字串中所有数字的和。
(3)以十进制形式显示数字串中最大数与最小数的乘积。
(4)对数字串进行处理,使每个字符在字符串中只出现一次。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)设计任务及要求分析(2)方案比较及认证说明(3)系统原理阐述(4)硬件设计课题需要说明:硬件原理,电路图,采用器件的功能说明(5)软件设计课题需要说明:软件思想,流程图,源程序及程序注释(6)调试记录及结果分析(7)总结(8)参考资料(9)附录:芯片资料或程序清单,软件演示屏幕拷贝图或硬件实物图时间安排:1月10日~1月12日:收集资料,方案选择1月13日~1月17日:整体流程,程序细节1月18日~1月20日:调试程序,报告撰写1月20:交设计报告,程序演示,答辩指导教师签名:年月日系主任(或责任教师)签名:年月日摘要 (1)1设计任务及要求分析 (2)1.1设计任务 (2)1.2要求分析 (2)2方案比较及认证说明 (3)3系统原理阐述 (4)3.1系统设计的软硬件环境 (4)3.2系统设计中用到的DOS调用 (4)4软件设计说明 (6)4.1主程序结构分析 (6)4.2子程序结构分析 (10)4.3中断程序结构分析 (11)5调试记录及结果分析 (13)5.1 调试记录 (13)5.1 调试结果分析 (14)6总结和心得体会 (15)参考文献 (16)附录1 源程序 (17)附录2 程序运行结果截图 (21)本科生课程设计成绩评定表 (22)随着计算机硬件的发展,微机系统的功能越来越强,而且计算机的程序设计语言也经过了一个发展的过程。
从最基本的机器语言到汇编语言,并到高级的智能化语言,如visual C++、visual Basic等,不断前进。
随着电子技术和计算机技术的发展和应用,计算机应用越来越广泛,计算机应用分为数值计算和非数值应用两大领域。
非数值应用又包括数据处理、知识处理,例如信息系统、工厂自动化、办公室自动化、家庭自动化、专家系统、模式识别、机器翻译等领域。
本文所设计的程序是运行于硬件和DOS操作系统下的,本程序通过调用DOS下的基本输入输出中断,实现字符串的输入和输出。
程序中有一个子程序,调用DOS输出中断显示在屏幕上,最后看用户是否要重复执行程序,若是则继续输入字符,若不是则按下回车键。
关键字:字符串;DOS;中断;子程序字符串处理1设计任务及要求分析1.1设计任务从键盘输入一个以回车结束的十进制数字串(不超过20 个)。
(1)按 ASCII 码值的降序显示这个数字串中ASCII 码值最大和最小的两个数字。
(2)以十进制形式显示数字串中所有数字的和。
(3)以十进制形式显示数字串中最大数与最小数的乘积。
(4)对数字串进行处理,使每个字符在字符串中只出现一次。
1.2要求分析从设计任务中可以看出此次课设要求是:从键盘中输入一个以回车结束的十进制数字串(不超过20 个),首先显示的是输入数字串中的最大值与最小值,再显示输入数字串中所有数字的和,接着显示最大值与最小值的乘积,最后对数字串进行处理后再显示清除相同字符之后的数字串。
显然通过键盘输入的此类十进制数实际上输入的是对应字符的ASCII码,若想完成设计要求的内容,就必须先将数字串中数字对应的二进制数求出,然后再求其他,任务完成后将二进制数再转换成对应的十进制数用显示器输出,完成指定要求。
2方案比较及认证说明输入输出方式的比较。
方案一:BIOS功能调用方式输入输出数据。
此方案使用相对复杂一些,而且我们对BIOS 功能调用不是很熟悉。
方案二:MSDOS功能调用的方式输入输出数据。
此方案简单实用、由于我们对MSDOS 比较熟悉,所以用起来十分方便。
综上所述,选用方案二的输入输出方式,输入数据和输出数据。
3系统原理阐述3.1系统设计的软硬件环境设计字符串处理的硬件环境是X86计算机平台的IBM-PC兼容机,开发的软件环境是Windows XP操作系统下的MFPCI98汇编编译环境。
虽然不是在标准的8086 IBM_PC平台下编程,也不是标准的DOS操作系统环境下编程,但是硬件平台是兼容8086的X86计算机平台,软件平台是更高级并且兼容DOS的Windows XP操作系统,所以程序运行的结果绝对跟标准8086IBM-PC平台上运行的结果完全一样。
3.2系统设计中用到的DOS调用DOS是美国Microsoft公司为IBM-PC研制的磁盘操作系统(Disk Operating System),也称为IBM-DOS或MS-DOS。
DOS不仅为用户提供了许多使用的指令,而其还有用户可以直接调用的上百个常用子程序。
对这些子程序的调用,称为系统功能调用。
这些子程序的功能主要是进行磁盘的读写、控制管理、内存管理、基本输入输出管理等。
在使用时,用户不需要关心和了解各种IO接口硬件的详细情况就能直接完成对IO接口的控制和管理。
为了使用方便,将所有子程序从1开始循序编号,这些编号称为DOS功能调用号。
其调用过程为:DOS功能调用号送AH寄存器。
如果需要,按要求给定输入参数(有的不需要输入参数)。
写入中断指令“INT 21H”。
下面介绍一些在本程序中用到的一些DOS输入输出功能。
(1)多字符输入——0AH功能:多个字符输入到缓冲区。
输入参数:DS:DX=输入缓冲区首地址。
输出参数:DS: DX=输入字符串所在缓冲区地址。
设置缓冲区要注意以下几点:●缓冲区第1个字节存放预定字符个数,最多255个。
●缓冲区第2个字节保留,用于调用返回时存放实际输入的字符个数。
●缓冲区第3个字节开始,存放输入的字符。
●缓冲区要考虑留一个字节作为回车符。
(2)多字符输出——9号功能:多个字符输出到屏幕显示。
输入参数:DS:DX=输出字符缓冲区首地址。
输出参数:无。
该功能对输出字符的个数没有要求,但是输出字符串要以‘$’结束。
(3)过程终止——4CH号该调用的功能是结束当前程序,并且返回调用它的程序。
如果在DEBUG状态下运行则返回DEBUG;如果在DOS下运行,则返回DOS。
在汇编语言程序结束处加上“MOV AX,4CH”和“INT 21H”两条指令,以利于程序执行完毕,返回操作系统控制。
4软件设计说明4.1主程序结构分析主程序的流程图如图4-1所示。
图4-1 主程序流程图主程序主要分为十个部分,分别为初始化,输出提示信息,清除上次输入的数据,输入字符串,找最大值,最小值,求和,求最大最小值的乘积以及使每个字符在字符串中只出现一次和询问是否需要继续。
首先是初始化,源程序如下所示:START: MOV AX,STACK1MOV SS,AXMOV AX,DATAMOV DS,AX其次是输出提示信息“Please input 20(or less)decimal number,end by enter:”,调用DOS9号功能实现,其源程序如下所示:BEGIN: LEA DX,NOTE0MOV AH,09HINT21H输入字符串调用DOS10号功能,其源程序如下所示:LEA DX,DEC_STRMOV AH,0AHINT21H找最大值是用第一个数依次与后面的数进行比较,若大于则保留继续与下一个数比较,若小于等于则相互交换后再与下一个数进行比较,直到全部比较完之后,就找出了最大值。
源程序如下所示:LEA SI,DEC_STRADD SI,2MOV AL,[SI]AA2: MOV BX,[SI]INC SICMP BH,13JE END1CMP AL,BHJA AA2MOV AL,BHJMP AA2END1: MOV [MAX],ALLEA DX,NOTE1MOV AH,09HINT21H找最小值与找最大值过程相似。
求和的过程是对输入的一串数字转换为二进制后进行依次累加,再将求和结果转换为ASCII码输出在屏幕上。
其源程序如下所示:MOV AX,0MOV BX,0LEA SI,DEC_STRM: INC SIMOV BL,[SI+1]CMP BL,13JE ENDAA4SUB BL,30HADD AX,BXJMP MENDAA4: CALL DEC2ASCMOV [SUM],AXLEA DX,NOTE3MOV AH,09HINT21H求最大最小值的乘积直接调用MUL乘法指令,将结果转换为ASCII码后输出在屏幕上。
其源程序如下所示:MOV BL,[MIN]SUB BL,30HMOV AL,[MAX]SUB AL,30HMUL BLCALL DEC2ASCMOV [PRODUCT],AXLEA DX,NOTE4MOV AH,09HINT21H处理程序使每个字符在字符串中只出现一次,即清除相同字符,若出现相同字符则用空格键代替,达到清除目的。
其源程序如下所示:LEA SI,DEC_STRADD SI,1NEXT1: INC SIMOV AL,[SI]CMP AL,'$'JE END3MOV BX,SINEXT2: INC BXCMP BYTE PTR [BX],'$'JE NEXT1CMP BYTE PTR AL,[BX]JE DELJMP NEXT2DEL: MOV BYTE PTR [BX],' 'JMP NEXT2END3: LEA DX,NOTE5MOV AH,09HINT21HLEA DX,DEC_STR+2MOV AH,09INT21H最后询问是否需要继续,若要继续则按Y或y键,若要退出则按N或n键。
其源程序如下所示:CON_YN: MOV AH,01HINT21HCMP AL,'Y'JE BEGINCMP AL,'y'JE BEGINCMP AL,'N'JE OVERCMP AL,'n'JE OVER主程序执行一次一共用了8次21H号中断。
第1、3、4、5、6、7次调用前AH写入的是9,所以这几次调用INT21是在屏幕上显示DX为首地址的字符串;第2次INT21H中断调用前AH写入了10,所以这两次调用的作用是输入字符串;最后一次在AH中写入4CH中,再调用INT21H,显然是把CPU交给操作系统;若不是则程序回到开始处,程序循环。
4.2子程序结构分析DEC2ASC (将二进制数转换成相应ASCII码形式十进制数函数),该函数的功能是将一个二进制数转化成对应ASCII码形式的十进制数,以便屏幕输出。