[预备知识]
完成学生登录和试题下载的任务,将试题包文件解压缩完后可看到有一个实验素材文件夹;在实验素材文件夹下,将diy文件夹下的所有.c文件复制到实验结果文件夹下;
打开实验结果文件夹,选择一个.c的文件,单击右键并选择“打开方式\选择程序”如图
选择“浏览”按钮,选择“c:\\program files\\microsoft visual studio\\common\\msdev98\\bin\\msdev.exe”程序,并将复选框打钩,单击“确定”,如图
双击.c扩展名的文件,自动启动VC++6.0的程序。
按要求依次完成DIY中的三项任务,调式程序、程序填空和编程题,将debug文件夹下的所有.exe 程序文件复制到实验报告和结果文件夹下,打开“实验报告.doc”文件,填写相关的原程序文件名和可执行程序文件名;
关闭所有应用程序,点击上传按纽。
[实验目的]
1.掌握字符串的概念、定义及存储
2.掌握字符串的基本操作
3.熟悉常用的字符串操作函数
[实验范例]
[问题] 输入两个字符串arr1和arr2,判断第1个字符串arr1是否包含第2个字符串arr2。
[分析]设第2个字符串长度小于第1个字符串。从第1个字符开始,从arr1中取出一个字符与arr2的第1个字符比较,若相同,则从arr1中取出与arr2长度相等的子字符串放入中间字符数组中,判断该中间字符串与arr2是否相等,若不同,则从arr1的下一个字符再判断。
[代码]
#include #include #define MAX 20 void main() { int i,j,k,m,n,flag=0; printf("请输入第一组字符串:"); 请输入第二组字符串:"); 第1个字符串的长度*/ 第2个字符串的长度*/ 初始化中间字符数组*/ 判断arr1的某个字符与arr2的第1个字符是否相同*/ 从arr1中取子串*/ 比较两个字符串是否相同*/ { 位置:%d,包含\\n",i+1); flag=1; 相同则变量flag置1*/ break; /*退出循环*/ } 不包含\\n"); } [DIY] 1、调试下列程序(下列各程序中存在一些问题,通过调试发现问题,并加以修正,使其实现预期目标) [1.1]以下程序统计字符串str中字符‘#’与数字字符的个数。 [代码] #include main() { char str[81]; int n1,n2; gets(str); for ( i = 0; str[i] ! = ‘\0’; i++ ){ if ( str[ i]=‘#’ ) n1 ++; if (str[i]>=0 && str[i] <= 9 ) n2 ++; } printf( “#=%d, digit=%d\\n”, n1, n2 ); } [1.2] 有n个国家参加运动会,开幕式上,各国的出场顺序以国名在英文字典中的位置先后为序,输出一份各国出场顺序表。 [代码] #include #include #define N 10 main() { char name[N][30], str[30]; int i, j; printf("Enter the name:\\n "); for(i=0; i for( i = 0; i { strcpy(name[i],str ); strcpy(name[i], name[j]); strcpy(name[j], str); } for( i=0; i 2.程序填空(请填写适当的符号,使程序实现其功能) [2.1] 程序的功能是删除字符串s中与变量c相同的字符。 main() { char s[80], c; int i,j; scanf("%s", s); getchar(); c=getchar(); for (i=j=0; (1) ;i++) if (s[i]!=c ) (2) ; s[j]='\\0'; puts(s); } [2.2]以下程序的功能是将字符串s中的数字字符放入d数组中,最后输出d中的字符串。例如,输入字符串:abc123edf456gh,执行程序后输出:123456。请填空。 3.编程 [3.1] 最多从键盘输入80个字符,遇到回车键就结束,将输入的字符串按奇偶位置拆分,奇数位字符在前偶数位字符在后重新组成新的字符串输出,例如输入: ab12cd3456fg,则经过程序处理后输出: a1c35fb2d46g。 [3.2] 编程序把从键盘输入的英文短文作为一个字符串(长度不超过80),把短文中每个单词的首字母改成大写(原输入可以是大写),若还发现有两个或两个以上连续的空格,把它们删成只有一个空格,输出修改后的字符串。 [本章测试] 一、单选题(10分) 1、以下合法的数组定义是:___________________。 A char a[]=”string”; B char a[6]=”string”; C int a[5]={0,1,2,3,4,5}; D int a[]={0,1,2,3,4,5}; 2、若有以下语句, 则下面正确的描述是__________。 char x[]="12345"; char y[]={'1','2','3','4','5'}; A. x数组和y数组的长度相同 B. x数组的长度大于y数组的长度 C. x数组的长度小于y数组的长度 D. x数组等价于y数组 3、若有以下定义:char s[]=“\\0187654321\\\\”; 则s 所占的内存空间为______。 A)1个字节 B)12个字节 C)11个字节 D)10个字节 4、下列关于字符串的说法中错误的是 A)在C语言中,字符串是借助于字符型一维数组来存放的,并规定以字符′\0′作为字符串结束标志 B)′\0′作为标志占用存储空间,计入串的实际长度 C)在表示字符串常量的时候不需要人为在其末尾加入′\0′ D)在C语言中,字符串常量隐含处理成以′\0′结尾 5、以下程序的输出结果是:_______。 #include “stdio.h” main() { char s[]="abcdef"; s[3]='\\0'; printf("%s\\n",s); } A) abcdef B) abcde C) abcd D) abc 6、有以下程序 #include “stdio.h” main() { char a[ ]={‘a’,‘b’,‘c’,‘d’, ‘e’, ‘f’, ‘g’,‘h’,‘\\0’}; int i,j; i=sizeof(a); j=strlen(a); printf(“%d,%d\\b”i,j); } 程序运行后的输出结果是 A) 9,9 B) 8,9 C) 1,8 D) 9,8 7、以下程序的输出结果是B #include “stdio.h” main() { char ch[3][5]={"AAAA printf("\\"%s\\"\\n",ch[1]); } A. "AAAA" B. "BBB" C. "BBBCC" D. "CC" 8、当执行下面的程序时,如果输入ABC,则输出结果是____。 #include “stdio.h” #include “string.h” main() { char ss[10]=“1,2,3,4,5”; gets(ss); strcat(ss, “67”); printf(“%s\\n”,ss); } A. ABC67 B. ABC67 C. 12345ABC6 D. ABC4567 9、有下面程序段 #include "stdio.h" #include "string.h" main() {char a[3][20]={{"china"},{"isa"},{"bigcountry!"}}; char k[100]={0},*p=k; int i; for(i=0;i<3;i++) { p=strcat(p,a[i]);} i=strlen(p); printf("%d\n",i);} 则程序段的输出结果是 A)18 B)19 C)20 D)21 10、有以下程序 #include #include main() { char p[][10]={ "abc int i,j; for(i=0;i<5;i++) for(j=i+1;j<5;j++) if(strcmp(p[i],p[j])<0) { strcpy(t,p[i]); strcpy(p[i],p[j]); strcpy(p[j],t); } printf("%d\\n",strlen(p[0])); } 程序运行后的输出结果是。 A. 6 B. 4 C. 5 D. 3 二、填空题(7分) 1、已知字符数组str的定义:char str[ ]=“ABCDEFGHIJ”;执行函数调用printf(“%.2s \\n”,str+5 )后的输出结果是______________________。 2、若有定义语句: char s[100],d[100]; int j=0, i=0;,且s中已赋字符串,请填空以实现字符串拷贝。(注:不得使用逗号表达式) while(s[i]){ d[j]= ; j++;} d[j]=’\\0’; 3、定义char words[10][20]; 使用printf写出语句:输出words中第一维下标i对应的字符串。 ______________________。 4、设有如下程序段,程序运行结果是__________________________)。 char s1[20]="P4CPU"; char s2[]="DVD+17\\"CRT+56KMODEM"; s2[10]='\\0'; strcat(s1,s2+3); puts(s1); 5、下面的程序输出结果是 __________________。 #include main() { char language[][10]={"FORTRAN int c; c=strcmp(language[1],language[3]); printf("%d\\n",c); } 6、下面程序的功能是将输入字符串的内容颠倒过来。请在空白处填空。 #include void main( ) { int i, j;char str[80]; (1) ; gets(str); for ( i=0, j=strlen(str) (2) ; i puts(str); } 三、程序调试题(10分) 1、下面程序功能是输入一个字符串,并将其中的字符’a’用字符串”shu”替代后输出。如输入为”123abcaHello”,则输出为”123shubcshuHello”。 [程序3-1] for (i=0; line[i]!=’\\n’; i++) if (line[i]==’a’) 2、下列程序的功能是:将字符串b连接到字符串a。 [程序3-2] #include void main( ) { char a[]="wel",b[]="come"; int i,n=0; for(i=0;b[i]!='\\0';i++) } 四、程序填空题(30分) 1、下面的程序功能是根据输入的学生姓名,查看该生是否是某个班的学生。(假设某个班有30人,姓名已根据字母顺序排列,即输入的班级学生姓名是有序的) [程序4-1] #include #include #define N 10 main() { char name[N][30], str[30]; int i,low=0,high=N-1,m; printf("Enter the name:\\n "); for(i=0; i strupr(name[i]); } /*输入姓名,转换为大写*/ for( i = 0; i gets(str); strupr(str); /*输入要查找的姓名,转换为大写*/ m=(low+high)/2; while(_______________________&&low<=high) { if(strcmp(name[m],str)>0) high=m-1; else if(strcmp(name[m],str)<0) low=m+1; m=_________________; } if(______________) printf("Found"); else printf("no found"); } 2、输入一行字符,从中读出所有单词,并将所有单词的首字符组成字符串后输出。设单词以空格分隔) [程序4-2] #include #include main() { char str[81],s[20],c; int i,j,word=0; printf("Enter the string\\n"); gets(str); i=0;j=0; while((c=str[i])!='\\0') { if(c==' ') /*空格表示单词结束*/ _______________; else if(c!=' '&& word==0) { word=1; _______________=c;} i++; } ___________________; printf("The new string is:%s\\n",s); } 五、编程题(36分) 1、输入一行字符,将双引号里面的字符不动,双引号外面的小写字母转换为大写字母。 2、不用C字符串函数,编写一个实现两个字符串连接的函数。下载本文