范文一:字符串程序的实现
实验七、字符串程序的实现
一、实验目的
1)了解和掌握字符串的常用物理存储方法;
2)了解和掌握字符串的基本操作。
二、实验工具
VC6.0
三、实验练习和要求
1、实验内容:
1)编写一个,可以存储任意的字符串(可假定长度不超过 255) ;
2)可以通过多种方式进行初始化
3)具有串的基本操作,至少有求串长,求子串,串比较和串的模式匹配方法 实验要求:
1) 至少可以由重复字符,字符数组,整数等初始化串的方法……;
2) 至少有求串长,求子串,串比较和串的模式匹配方法……。
3)设计 mail 主函数进行验证。
#include #define MaxSize 100 typedef struct { char data[MaxSize]; int length; } SqString; //以下函数需要自己编写。 void StrAssign(SqString &str,char cstr[]); void StrCopy(SqString &s,SqString t); bool StrEqual(SqString s,SqString t); int StrLength(SqString s); SqString Concat(SqString s,SqString t); SqString SubStr(SqString s,int i,int j); bool strMatch(SqString s,SqString t)); void main() { SqString s,s1,s2,s3,s4; printf( printf( StrAssign(s, StrAssign(s1, printf( tr(printf( printf( s3=SubStr(s,2,10); printf( printf( s4=Concat(s1,s2); printf( } 完整代码: #include #include #define MaxSize 100 typedef struct { char data[MaxSize]; int length; }SqString; void StrAssign(SqString &str,char cstr[]) { int i; for(i=0;cstr[i]!='\0';i++) str.data[i]=cstr[i]; str.length=i; } void StrCopy(SqString &s,SqString t) { int i; for(i=0;i<> s.data[i]=t.data[i]; s.length=t.length; } bool StrEqual(SqString s,SqString t) { int same=1,i; if(s.length!=t.length) same=0; else for(i=0;i<> if(s.data[i]!=t.data[i]){ same=0; break; } return same; } int StrLength(SqString s) { return s.length; } SqString Concat(SqString s,SqString t) { SqString str; int i; str.length=s.length+t.length; for(i=0;i<> str.data[i]=s.data[i]; for(i=0;i<> str.data[s.length+i]=t.data[i]; return str; } SqString SubStr(SqString s,int i,int j) { SqString str; int k; str.length=0; if(i<=0 ||="" i="">s.length || j<0 ||="" i+j-1="">s.length){ printf( return str; } for(k=i-1;k<> str.data[k-i+1]=s.data[k]; str.length=j; return str; } SqString InsStr(SqString s1,int i,SqString s2){ int j; SqString str; str.length=0; if(i<=0 ||="" i="">s1.length+1){ printf( return s1; } for(j=0;j<> str.data[j]=s1.data[j]; for(j=0;j<> str.data[i+j-1]=s2.data[j]; for(j=i-1;j<> str.data[s2.length+j]=s1.data[j]; str.length=s1.length+s2.length; return str; } bool strMatch(SqString s,SqString t) { int i=0,j=0; while((s.data[i]!='\0') &&(t.data[j]!='\0')){ if(s.data[i]==t.data[j]){ i++; j++; } else{ i=i-j+1; j=0; } } if(t.data[j]=='\0') return(i-j+1); else return 0; } void DispStr(SqString s){ int i; if(s.length>0) { for(i=0;i<> printf( printf( } } void main() { SqString s,s1,s2,s3,s4; printf( printf( StrAssign(s, StrAssign(s1, printf( printf( printf( s2=InsStr(s,9,s1); printf( s3=SubStr(s,2,10); printf( printf( s4=Concat(s1,s2); printf( } 四、疑难问题的解决和感想 (重点介绍程序中遇见的错误和自己如何解决的) 在编程序时有好多不会的地方, 首先把自己会写的函数写下来, 然后不会的就网上查资 料或者看书,然后把不会的弄懂,最后完成实验! 考研屋 www.kaoyanwu.com 提供各大机构考研、公务员、四六级辅导视频课程 import java.util.*; /** * 文件标题: *关于字符串的一些处理方法: * @版 本 1.0 */ public class StringUtil { public StringUtil() { } /** * @description 字符串替代函数 * @param source String 源字符串 * @param be_rep_str String 需要被替换的子串 * @param rep_str String 要替换的目标串 * @param return_str String * @return String */ public static String replaceStr(String source, String be_rep_str, String rep_str, String return_str) { if (source.indexOf(be_rep_str) test.indexOf(“#”)) && test.indexOf(“#”) != -1) { sep = “#”; } } else { sep = “#”; } String[] st; List flds = new ArrayList(); if (sep.equals(“u0020”)) { StringTokenizer stto = new StringTokenizer(test.trim(), sep); while (stto.hasMoreTokens()) { flds.add(stto.nextToken()); } st = (String[]) flds.toArray(new String[stto.countTokens()]); } else { st = test.trim().split(sep); } return st; } //public String DBC2SBC(String str) //{ //int i ; //String result = ““; //for (i = 0 ; i = 65281 && code 全角 SBC case * @para 考研屋www.kaoyanwu.com :提供各大机构考研、公务员、四六级辅导视频课程 专业提供提供各大机构考研、公务员、四六级辅导视频课 break举例:小写字母转换成大写字母,直至输入非字母字符 #include void main() {char c; while(1) { c=getchar(); if(c>='a' && c<='z') putchar(c-32);="">='z')> else if(c>=?A' && c<=?z') putchar(c);="">=?z')> else break; } } 译密码:按一定规律将电文变成密码: 将字母A变为E、将字母a变为e,即变成其后的第四个字母,W将变成A。字母按上述规律转换,非字母字符不变。输入一行字符,输出相应密码。 #include void main() { char c; while((c=getchar())!='\n') { if((c>='a'&&c<='z')||(c>='A'&&c<='z'))>='z'))> { c=c+4; if(c> 'Z'&&c<= 'z'+4||c="">'z') c=c-26; } printf("%c",c); } printf(“\n"); } 字符数组: 输出一个字符串 #include void main() { char c[10]={'I',' ','a','m',' ','a',' ','b','o','y'}; int i; for(i=0;i<10;i++)>10;i++)> printf("%c",c[i]); printf("\n"); } 输出一个钻石图形 #include void main() { char diamond[ ][5]={{' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'}, {' ','*',' ','*'},{' ',' ','*'}}; int i,j; for(i=0;i<> {for(j=0;j<5;j++)>5;j++)> printf("%c",diamond[i][j]); printf("\n"); } } , 字符串处理函数包含在头文件 string.h 中 , 字符串输出函数 puts , 格式: puts(字符数组) , 功能:向显示器输出一个字符串(输出完,换行) , 说明:字符数组必须以?\0?结束。可以包含转义字符。 输出时?\0?转换成?\n?,即输出字符后换行。 例: #include void main( ) { char a1[ ]=“china\ nbeijing” ; char a2[ ]=“china\ 0beijing” ; puts(a1); puts(a2); puts(“WUHAN” ); } , 字符串输入函数gets , 格式:gets (字符数组) , 功能:从键盘输入一个以回车结束的字符串放入字符 数组中,并自动加?\0?。 , 说明:输入串长度应小于字符数组维数 gets和scanf输入比较 #include void main( ) { char a1[15], a2[15] ; gets(a1); scanf(“%s”,a2); printf (“a1=%s\ n”,a1); printf (“a2=%s\ n”,a2); } 注意:puts和gets函数只能输入输出一个字符串 , 字符串连接函数strcat , 格式:strcat (字符数组1,字符数组2) , 功能:把字符数组2连到字符数组1后面 , 返值:返回字符数组1的首地址 , 说明: 字符数组1必须足够大 连接前,两串均以?\0?结束;连接后,串1的?\0?取 消,新串最后加?\0?。 例: #include void main( ) { char str1[30]={“People?s Republic of “}; char str2[]={China”}; printf (“%s\n”,strcat(str1,str2)); } , 字符串拷贝函数strcpy , 格式:strcpy(字符数组1,字符串2) , 功能:将字符串2,拷贝到字符数组1中去 , 返值:返回字符数组1的首地址 , 说明: 字符数组1必须足够大,>字符串2 字符数组1必须是数组名形式(str1), 字符串 2可以是字符数组名或字符串常量。 拷贝时?\0?一同拷贝 ?不能使用赋值语句为一个字符数组赋值 strcpy与strcat应用举例 #include void main() { char destination[25]; char blank[] = " ", c[]= "C++", turbo[] = "Turbo"; strcpy(destination, turbo); strcat(destination, blank); strcat(destination, c); printf("%s\n", destination); } , 字符串比较函数strcmp , 格式:strcmp(字符串1,字符串2) , 功能:比较两个字符串 , 比较规则:对两串从左向右逐个字符比较(ASCII码), 直到遇到不同字符或?\0?为止。 , 返回值:返回int型整数。其值是ASCII码的差值 a. 若字符串1< 字符串2,="" 返回负整数=""> b. 若字符串1> 字符串2, 返回正整数 c. 若字符串1== 字符串2, 返回零 , 说明:字符串比较不能用“==”,必须用strcmp, 虽然编译无错,但结果不对 字符比较 #include void main( ) { int i,j,k; char a1[ ]=“wuhan”, a2[ ]=“beijing” ; i=strcmp(a1,a2); j=strcmp(“china”, “korea”); k=strcmp(a2, “beijing” ); printf(“i=%d\ nj=%d\ nk=%d\ n”,i,j,k); } , 字符串长度函数strlen , 格式:strlen(字符数组) , 功能:计算字符串长度 , 返值:返回字符串实际长度,不包括?\0?在内 测试字符串长度 #include void main( ) { char a1[10]=“ china” ; printf (“%d\ n”,strlen(a1)); printf (“%d\ n”, strlen(“beijing\ 0wuhan”)); } , 大写字母转换成小写字母函数strlwr , 格式:strlwr(字符串) , 小写字母转换成大写字母函数strupr , 格式:strupr(字符串) 例:字符转换 #include void main( ) { char a1[6]=“CHinA”, a2[ ]=“wuHAn” ; printf (“%s\ n”,strlwr(a1)); printf (“%s\ n”,strupr(a2)); } 输入一行字符,统计其中的单词个数,单词间空格分开。 #include void main() {char string[81]; int i,num=0,word=0; char c; gets(string); for(i=0;(c=string[i])!='\0';i++) if(c==' ') word=0; else if(word==0) {word=1; num++;} printf("There are %d words in the line\n",num); } 有3个字符串,要求找出其中最大者。 #include #include void main() { char string[20],str[3][20]; int i; for(i=0;i<3;i++)>3;i++)> gets(str[i]); if(strcmp(str[0],str[1])>0) strcpy(string,str[0]); else strcpy(string,str[1]); if(strcmp(str[2],string)>0) strcpy(string,str[2]); printf("\nThe largest string is:\n%s\n",string); } 接受键盘输入的两个字符串,并将其首尾相接后输出。每个字符串内部不含空格,两个字符串之间以空白符分隔。 #include void main() { char str1[50],str2[20]; int i,j; printf("Enter string No.1:\n"); scanf("%s",str1); printf("Enter string No.2:\n"); scanf("%s",str2); i=j=0; while(str1[i]!='\0') i++; /*寻找字符串str1的尾*/ while((str1[i++]=str2[j++])!=?\0?) ; /*str2加入到str1*/ printf("string No.1->%s\n",str1); } 从键盘输入若干行文本,每行以回车结束,以 ctrl+z 作为输入结束符,统计其行数。 #include void main() { int c,nl; nl=0; while((c=getchar())!=EOF) if(c=='\n') /*如果是换行,则nl加1*/ ++nl; printf("%d\n",nl); } 把输入的字符串逆序排列,并显示。 #include void main() { char str[80]; int temp,i,j; printf("Enter a string:\n"); scanf("%s",str); for(i=0,j=strlen(str)-1;i { temp=str[i]; str[i]=str[j]; /*交换i,j两个元素*/ str[j]=temp; } printf("\nReversed string:\n%s\n",str); } 从键盘输入字符,以 ctrl+z 结束,统计输入的数字 0,9、空白符和其它字符的个数。 #include void main() { int c,i,nwhite,nother,ndigit[10]; /*存放相应的计数值*/ nwhite=nother=0; for(i=0;i<10;i++) 初始化这些计数值*/="">10;i++)> ndigit[i]=0; while((c=getchar())!=EOF) if(c>='0'&&c<='9')>='9')> ++ndigit[c-'0']; /*相应的ndigit[i]加1*/ else if(c==' '||c=='\n'||c=='\t') ++nwhite; else ++nother; for(i=0;i<10;i++)>10;i++)> printf("digit '%d':%d\n",i,ndigit[i]); printf("white space:%d\n",nwhite); printf("other character:%d\n",nother); } 从键盘输入一个字符串(长度不超过20,其中不含空格),将其复制一份,复制时将小写字母都转换成为大写字母)。 #include void main() { char a[20],b[20]; int i; printf("Enter a string:\n"); scanf("%s",a); i=0; do { b[i]=(a[i]>='a'&&a[i]<='z')? 将a数组中小写字母转为*/="" a[i]-'a'+'a':a[i];="">='z')?> /*大写并对b数组赋值*/ } while(a[i++]!='\0'); printf("Copyed string:\n%s\n",b); } 字符串 题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。 main() {int len; char *str[20]; printf("please input a string:\n"); scanf("%s",str); len=length(str); printf("the string has %d characters.",len);} length(p) char *p; {int n;n=0; while(*p!='\0') { n++; p++;} return n;} 题目:字符串排序。 main() {char *str1[20],*str2[20],*str3[20]; char swap(); printf("please input three strings\n"); scanf("%s",str1); scanf("%s",str2); scanf("%s",str3); if(strcmp(str1,str2)>0) swap(str1,str2); if(strcmp(str1,str3)>0) swap(str1,str3); if(strcmp(str2,str3)>0) swap(str2,str3); printf("after being sorted\n"); printf("%s\n%s\n%s\n",str1,str2,str3);} char swap(p1,p2) char *p1,*p2; {char *p[20];strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);} ============================================================== 题目:两个字符串连接程序 #include "stdio.h" main() {char a[]="acegikm"; char b[]="bdfhjlnpq"; char c[80],*p; int i=0,j=0,k=0; while(a[i]!='\0'&&b[j]!='\0') {if (a[i] { c[k]=a[i];i++;} else c[k]=b[j++]; k++;} c[k]='\0'; if(a[i]=='\0') p=b+j; else p=a+i; strcat(c,p); puts(c);} 【程序96】 题目:计算字符串中子串出现的次数 #include "string.h" #include "stdio.h" main() { char str1[20],str2[20],*p1,*p2; int sum=0; printf("please input two strings\n"); scanf("%s%s",str1,str2); p1=str1;p2=str2; while(*p1!='\0') {if(*p1==*p2) {while(*p1==*p2&&*p2!='\0') {p1++;p2++;}} else p1++; if(*p2=='\0') sum++; p2=str2;} printf("%d",sum); getch();} ============================================================== 【程序97】 题目:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。 #include "stdio.h" main() { FILE *fp; char ch,filename[10]; scanf("%s",filename); if((fp=fopen(filename,"w"))==NULL) {printf("cannot open file\n"); exit(0);} ch=getchar(); ch=getchar(); while(ch!='#') {fputc(ch,fp);putchar(ch); ch=getchar();} fclose(fp);} ============================================================== 【程序98】 题目:从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。 输入的字符串以~结束。 #include "stdio.h" main() {FILE *fp; char str[100],filename[10]; int i=0; if((fp=fopen("test","w"))==NULL) { printf("cannot open the file\n"); exit(0);} printf("please input a string:\n"); gets(str); while(str[i]!='!') { if(str[i]>='a'&&str[i]<='z') str[i]="str[i]-32;">='z')> fputc(str[i],fp); i++;} fclose(fp); fp=fopen("test","r"); fgets(str,strlen(str)+1,fp); printf("%s\n",str); fclose(fp);} ============================================================== 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 1.程序分析:利用while语句,条件为输入的字符不为'\n'. #include "stdio.h" main() {char c; int letters=0,space=0,digit=0,others=0; printf("please input some characters\n"); while((c=getchar())!='\n') { if(c>='a'&&c<='z'||c>='A'&&c<='z')>='z')> letters++; else if(c==' ') space++; else if(c>='0'&&c<='9')>='9')> digit++; else others++;} printf("all in all:char=%d space=%d digit=%d others=%d\n",letters, space,digit,others);} ============================================================== 关于程序中使用10000以上字符串数组的处理 我的程序中需要使用10000个以上的rsa的publickey,和privateKey。但是这个些内容如果 存储在string数组中很大啊,写起来也麻烦,在C#中有没有其它的方式在代码中去调用这 些字符串。 这些字符串都是事先使用fromxml函数导出来的是写死的。 ------解决方案-------------------------------------------------------- 数据集,列表 ------解决方案-------------------------------------------------------- 你的数量已经定了,你要读到内存就要占用很大的空间,除非你部分放到内存,比如分成一 个个小文件,可以通过哈希表管理,你查询时,只加载一部分文件到内存,查找完关闭,如 果没有,继续加载其他文件 计算机程序设计——关于字符串的一些处理技巧 import java.util.*; /** * 文件标题: *关于字符串的一些处理方法: * @版本 1.0 */ public class StringUtil { public StringUtil() { } /** * @description 字符串替代函数 * @param source String 源字符串 * @param be_rep_str String 需要被替换的子串 * @param rep_str String 要替换的目标串 * @param return_str String * @return String */ public static String replaceStr(String source, String be_rep_str, String rep_str, String return_str) { if (source.indexOf(be_rep_str) < 0)="" {=""> return source; } else { String head = source.substring(0, source.indexOf(be_rep_str)); String body = rep_str + source.substring(source.indexOf(be_rep_str) + be_rep_str.length()); return_str = replaceStr(head + body, be_rep_str, rep_str, return_str); } return return_str; } public static String[] getFields(String test, String sep) { //坼分字符,将字句test按照sep进行坼分。 sep = "u0020"; if (test.indexOf(sep) != -1) { if ( (test.indexOf(sep) > test.indexOf("#")) && test.indexOf("#") != -1) { sep = "#"; } } else { sep = "#"; } String[] st; List flds = new ArrayList(); if (sep.equals("u0020")) { StringTokenizer stto = new StringTokenizer(test.trim(), sep); while (stto.hasMoreTokens()) { flds.add(stto.nextToken()); } st = (String[]) flds.toArray(new String[stto.countTokens()]); } else { st = test.trim().split(sep); } return st; } //public String DBC2SBC(String str) //{ //int i ; //String result = ""; //for (i = 0 ; i < str.length();="" i++)=""> //{ //code = str.charCodeAt(i) ; //// “65281”是“~”,“65373”是“,” //if (code >= 65281 && code < 65373)=""> ////“65248”是转换码距 //result += String.fromCharCode(str.charCodeAt(i) - 65248) ; //else //result += str.charAt(i) ; //} //return result ; //} /** * 半角 DBC case -> 全角 SBC case * @param QJstr String * @return String */ public static final String BQchange(String QJstr) { String outStr = ""; String Tstr = ""; byte[] b = null; for (int i = 0; i < qjstr.length();="" i++)="" {=""> try { Tstr = QJstr.substring(i, i + 1); b = Tstr.getBytes("unicode"); } catch (java.io.UnsupportedEncodingException e) { e.printStackTrace(); } if (b[3] != -1) { b[2] = (byte) (b[2] - 32); b[3] = -1; try { outStr = outStr + new String(b, "unicode"); } catch (java.io.UnsupportedEncodingException e) { e.printStackTrace(); } } else { outStr = outStr + Tstr; } } return outStr; } /** * 全角 转换成 -> 半角 * @param QJstr String * @return String */ public static final String QBchange(String QJstr) { String outStr = ""; String Tstr = ""; byte[] b = null; for (int i = 0; i < qjstr.length();="" i++)="" {=""> try { Tstr = QJstr.substring(i, i + 1); b = Tstr.getBytes("unicode"); } catch (java.io.UnsupportedEncodingException e) { e.printStackTrace(); } if (b[3] == -1) { b[2] = (byte) (b[2] + 32); b[3] = 0; try { outStr = outStr + new String(b, "unicode"); } catch (java.io.UnsupportedEncodingException e) { e.printStackTrace(); } } else { outStr = outStr + Tstr; } } return outStr; } public static void main(String aa[]) { String qj = ",?,,???,()"; String bj = "#@$%^&*()"; System.out.println("半角转换成全角:" + bj + "-->" + BQchange(bj)); String s = " "; String qs = ""; System.out.println("全角转换成半角:"+qj + " -->" + QBchange(qj)); System.out.println( (int) (QBchange(qs).toCharArray()[0])); System.out.println( (int) s.toCharArray()[0]); String dd[] = getFields("23#99#99#99", "#"); for (int i = 0; i < dd.length;="" i++)="" {=""> System.out.println("asfd" + dd[i]); } System.out.println(dd.length); } }范文二:程序设计-关于字符串的一些处理技巧
范文三:关于字符串c语言程序集合
范文四:关于程序中使用10000以下字符串数组的处理
范文五:计算机程序设计关于字符串的一些处理技巧