关于字符串处理的一些总结

 

关于字符串处理的提示

1.字符串的存贮

(1)内存格式 ??? 串长为n的字符串在内存中连续存放,每个字符存贮其ASCII码,占一个字节,共n个字节,最后填一个全0字节作为串的结束标志。空串也有一个字节,即只有结束标志字符'\0'。

(2)程序中怎样存贮字符串

①用字符数组存贮串:

例:char s[4]; /* 用字符串初始化一个字符数组*/

char s[41] = {"ABCD"};

char s[41] = "ABCD";

char s[41] = {'A','B','C','D',0}

②用字符串常量初始化一个字符指针变量建立串

char *s="ABCD";

s得到的是串"ABCD"的首地址,即字符A的存贮地址。

s[0]为'A',s[4] = 0

③用内存分配函数建立串

char *t;

t = (char *)malloc(81);

strcpy(t,"DEF");

……

free((void *)t);

 

2.字符串的输入与输出

(1)输入字符串:scanf("%s",串首地址);

以空格/TAB回车换行为字符串的结束

  不能输入含有空格的字符串

  gets(串首地址); /*头文件stdio.h */

  以行作为字符串的输入单位

(2)输出字符串:printf("%s",串首地址); 或 puts(串首地址); /*头文件stdio.h*/

3.字符串的基本操作函数 ( 头文件均为string.h)

拷贝串(串赋值):strcpy(char *s, char *t)

功能:串t内容连同结尾的'\0'复制到地址s开始的内存空间。

例:

char s[81],t[41];

strcpy(t,"ABCD");

strcpy(s,t);

puts(s);

 

输出:ABCD


对比: char *s = "ABCD",*t;

t = s; /*地址赋值*/

t = (char *)malloc(11);

strcpy(t,s); /*串赋值*/

  • 连接串:strcat(char *s,char *t)

功能:串t复制到串s结尾,串s加长,串t不变.

例:char s[41]="ABCD",*t="EF"

strcat(s,t);

puts(s);

输出: ABCDEF

  • 求串长: int strlen(char *s)

功能: 返回串s的长度,空串长度为0。

  • 大小写变换:

strupr(char *s); /*变大写*/

strlwr(char *s); /*变小写*/

  • 两串比较大小:int strcmp(char *s,char *t)

串s>串t   返回正数

串s==串t  返回值0

串s<串t   返回负数

例:两串比较大小的方法:对应字符比较ASCII码大小,ASCII大的则串大;对应字符位置均相同,则串长大的串大。

"ABCD">"ABC"  "ABCD"<"a"

"ABCD"<"ABDC"  "0101"<"9"

"ABCD">"9A8B"

对比: if (strcmp(s,t) == 0)  /*比较两串相等*/

    if (s == t)      /*比较两指针值是否相等*/

    if (s = t)       /*可能合法但不合理*/

字符串处理程序设计举例

例1:不用字符串处理函数,求串长

#include "stdio.h"

void main(){

   char s[81],*p;

   int n = 0;

   printf("Input a string:\n");

   gets(s);

   p = s;

   while(*p) {

      n++;

      p++;

   } /* *p!=0 或 *p!='\0' */

   printf("length=%d\n",n);

} /*利用串结束标志为0作为循环结束条件*/

字符串处理的其它典型扫描结构

for(p=s;*p;p++) n++; /*for指针循环法*/

for(n=0;s[n];n++) ; /*for下标循环法*/

例2:不用串处理函数,自编程序实现串拷贝

#include "stdio.h" /*方法一:下标法*/

void main(){

   char s[41],t[41],i; /*串t复制到串s */

   gets(t);

   i = 0;

   while (s[i] = t[i++]);

   puts(s);

}

#include "stdio.h" /*方法二:for循环指针法*/

void main(){

   char *p,*q,s[41],t[41];

   gets(t);

   for(p = s,q = t;*q != '\0';)

      *p++=*q++;

   puts(s);

} /* !注意区别: '\0'-0 , '0'-48 */

例3:写一个函数,实现两个字符串比较大小

要求:串s<串t 返回负数

   串s=串t 0

串s>串t 正数

int mystrcmp(char *s,char *t) {

   char *p,*q;

   p = s;

   q = t;

   while(*p && *q && *p == *q) {

      p++;

      q++;

   }

   return *p-*q;

}

/*注意本例中对串尾'\0'字符的巧妙利用*/

例4:写个函数,实现字符串逆序存贮

分析:以中点为对称点,交换字符

#include "stdio.h"

void main() {

   char s[81],*p,*q,ch;

   printf("Input a string:\n");

   gets(s);

   for(p = q = s;*q;q++);

      q--;

   while (p < q) {

      ch = *p;

      *p = *q;

      *q = ch;

      p++;

      q--;

   }

   printf("s=%s\n",s);

}

例5:输入一句英文,按单词分行输出

如:输入We are students,

输出We

  are/*算法:遇空格换行,其余字符原样输出*/

  students

#include "stdio.h"

void main(){ /*注意多个空格只换行一次的方法*/

   char s[81],*p;

   printf("Input a sentence:\n");gets(s);

   for(p = s;*p;p++)

      if (*p == 32) {

         if(*(p + 1) != 32)

            printf("\n");

      } else

         putchar(*p);

}

例6:写一个函数,求一个字符串中最长的英文单词。(假设单词仅用空格作为分隔)

#include "stdio.h"

void GetWord(char *s,char *pword);

void main() {

   char s[81],word[31];

   printf("Input a sentence:\n");

   gets(s);

   GetWord(s,word);

   printf("Longest word is %s\n",word);

}

void GetWord(char *s,char *pword) {

   int n = 0,maxlen = 0;

   char *p,*q = NULL;

   for(p = s;*p;p++)

      if(*p == 32) {

         if(n > maxlen) {

            q = p-n;

            maxlen = n;

         }

         n = 0;

      } else

         n++;

   for(n = 0;n < maxlen;n++) *(pword + n) = *q++;

   *(pword + maxlen) = '\0';

}

你可能感兴趣的:(编程基础)