关于字符串处理的提示
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); /*串赋值*/
功能:串t复制到串s结尾,串s加长,串t不变.
例:char s[41]="ABCD",*t="EF"
strcat(s,t);
puts(s);
输出: ABCDEF
功能: 返回串s的长度,空串长度为0。
strupr(char *s); /*变大写*/
strlwr(char *s); /*变小写*/
串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';
}