字符串定义

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

int StrLength ( HString *S) { //求字符串S的长度 return S->curLen; } int StrEmpty ( HString *S ) { //判断字符串S空否。空返回1,否则返回0 return S->curLen == 0; } //等价于 if ( S->curLen == 0 ) return 1; // else return 0;
char *Trans ( String *S ); //指针转换:求串S中存储堆的首地址 void StrAssign ( String *S, char *cs ); //从字符数组cs创建字符串S void StrConcat ( String *S, String *S1, String *S2 ); //字符串S2连接于S1后面, 结果存于S中 void SubString ( String *T, String *S, int pos, int count ); //从串S中第pos字符起连续取count个字符, //由串T返回
{ printf ("overflow"); exit(1); }
strcpy( S->ch, cs ); //复制老数组到新串中 S->curLen = n-1; //新串的长度 }
void StrConcat ( HString *S, HString *S1, HString *S2 ) { //字符串S2连接于S1后面, 结果存于S中 int n = S1->curLen + S2->curLen + 1; free( S->ch); //重新分配串空间 S->ch = (char *) malloc (n * sizeof (char) ); if ( S ch == NULL) S->ch { printf ("overflow"); exit (1); } strcpy ( S->ch, S1->ch ); //串S1复制到S中 strcat ( S->ch, S2->ch); //串S2连接到S后部 S->curLen = n-1; //串长度 }
void StrInsert ( String *S, char *cs, int pos ); //插入字符数组cs到串S的第pos位置 void StrInsert1( String *S, String *CS, int pos ); //插入串CS到串S的第pos位置 void StrDelete ( String *S, int pos, int count ); //从pos位置起在串S中连续删除count个字符 void FreeString ( String *S ); //释放串S的空间 void ClearString ( String *S ); //清空字符串
字符串定义 字符串的顺序表示及操作 的实现 字符串的模式匹配
字符串 (String)
字符串是 n ( ≥ 0 ) 个字符的有限序列, 个字符的有限序列, 记作 S : “c1c2c3…cn” 其中,S 是串名字 其中, “c1c2c3…cn”是串值 ci 是串中字符 n 是串的长度。 是串的长度。 “Tsinghua University” 例如, 例如, S = “Tsinghua University”
提取子串的算法示例
pos = 2, count = 3 i n f i n i t y pos = 5, count = 4 i n f i n i t y 超出 f i n i t y
pos+count -1 ≤ curLen-1 -
pos+count-1 > curLen-1 修改 count = curLen-pos -
int StrCompare ( HString *S, HString *T ) { //比较字符串S与T: 若S = T, 返回值 = 0; 若S > // T, 返回值= 1; 若S < T, 返回值 = -1。 return strcmp ( S->ch, T->ch ) ); }
void StrAssign ( HString *S, char *cs ) { //从字符数组cs创建字符串S int n = strlen(cs) +1; //新串的长度 free ( S->ch ); //释放老串的堆空间 S->ch = (char *) malloc ( n * sizeof (char) ); if ( S->ch == NULL )
void SetString ( HString *S ) { //创建一个空的字符串S S->ch = ( char *) malloc ( maxLen *sizeof (char) ); if ( S->ch == NULL ) { printf ("overflow"); exit (1); } *(S->ch) = '\0'; S->curLen = 0; }
字符串比较函数 strcmp (str1, str2) //从两个字符串第 1 个字符开始,逐个对 // //应字符进行比较,全部字符相等则函数返 // //回0,否则在不等字符处停止比较,函数 // //返回其差值 — ASCII代码 // 例 str1 “University” i 的代码值105 “Universi 105
str2 “Universal” “Universa a 的代码值97,差8 97, 8
字符串类型的主要操作
void SetString ( String *S ); //创建一个空的字符串S int StrLength ( String *S ); //求字符串S的长度(字符个数) int StrEmpty ( String *S ); //判断字符串S空否。空返回1,否则返回0 char StrGetData ( String *S, int pos ); //读取字符串S中第pos个字符 int StrCompare ( String *S, String *T); //比较字符串S与T。
gets(name); puts(name);
字符串求长度函数 strlen(str) 字符串长度不包括“\0”和分界符
字符串连接函数 strcat (str1, str2) 例 str1 “Tsinghua\0” “Tsinghua\ // //连接前
str2 str1 str2 “University\ “University\0” // //连接前 “TsinghuaUniversity\ //连接后 “TsinghuaUniversity\0” // “University\0” “University\ // //不变
在C中常用的字符串操作
字符串初始化
char name[12] = “Tsinghua”; char name[ ] = “Tsinghua”; char name[12] = {‘T’,‘s’,‘i’,‘n’,‘g’,‘h’,‘u’,‘a’}; char name[ ] = {‘T’,‘s’,‘i’,‘n’,‘g’,‘h’,‘u’,‘a’,‘\0’}; char *name = “Tsinghua”; char name[12]; name = “Tsinghua”; × 因数组名是地址常量
利用串的操作实现串的定位算法
此算法就是求子串P在串T 此算法就是求子串P在串T中首次出现的位置
第 1趟 第 2趟 第 3趟 第 4趟 T abbaba P aba T abbaba P aba T abbaba aba P T abbaba P aba √
int index ( string *T, string *P ) { //在串T中寻找与串P相匹配的子串。若有, //函数返回子串在串中位置,若无,返回-1。 int LT = StrLength (T), LP = StrLength (P); string *subStr; int i = 0; while ( i <= LT - LS ) { SubString ( subStr, T, i, LP ); if ( !StrCompare ( SubStr, P ) ) return i; else i++; } return -1; }
单个字符串的输入函数 gets (str) 例 char name[12];
gets (name);
多个字符串的输入函数 scanf 例 char name1[12], name2[20];
scanf (“%s%s\n”, name1, name2); (“%s%s\
字符串输出函数 puts (str) 例 char name[12];
free ( T->ch ); T->ch = (char *) malloc ( (count+1) * sizeof (char)); if ( T->ch == NULL ) //重新分配子串空间 { printf ("overflow"); exit(1); } p = T->ch; q = S->ch + pos; for ( i = 1; i <= count; i++ ) *p++ = *q++; //从串S向子串T复制其中的字符 *p=‘\0’; //子串T结束符 T->curLen = count; //子串长度 }
字符串的顺序方式( 字符串的顺序方式(堆)定义
const int maxLen = 128; typedef struct { char *ch; //串的存储数组 int curLen; //串的当前长度 } HString;
0 1 2 3 4 5 6 7 8 9 maxLen-1
பைடு நூலகம்
ch T S I N G H U A curLen
char StrGetData ( HString *S, int pos) { //读取字符串S中第pos个字符 if ( pos < 0 || pos > S->curLen-1) { printf ("位置pos无效!"); exit (1); } return S->ch[pos]; } char *Trans ( HString *S ) { //指针转换:求串S中存储堆的首地址 return S->ch; }
void StrInsert ( HString *S, char *cs, int pos ) { //插入字符数组cs到串S的第pos位置 int n, i, charsleft; char *temp, *p, *q; if ( pos < 0 || pos > S->curLen ) { printf ( "位置pos无效!\n" ); exit (1); } n = S->curLen+1; temp = (char *) malloc ( n*sizeof (char) ); if ( temp == NULL ) //创建临时串 { printf ( "overflow" ); exit (1); } strcpy( temp, S->ch ); //复制串S到临时串 free( S->ch); //释放串S原来的空间 n = strlen(temp)+strlen(cs)+1; //新串长度
void SubString( HString *T, HString *S, int pos, int count) { //从串S中第pos字符起连续取count个字符,由 //串T返回 int i, charsleft; char *p, *q; if ( pos < 0 || pos > S->curLen-1) { printf ( "位置pos无效!\n"); exit(1); } if ( count < 0 ) { printf ( “参数count无效!\n"); exit(1); } charsleft = S->curLen - pos; if ( count > charsleft ) count = charsleft;
相关文档
最新文档