字符指针可以指向一个字符串,可用字符串常量对字符指针进行初始化。例如:
#include <stdio.h>
#include <stdlib.h>
int main(){
char *str="this is a string";
printf("%s",str);
return 0;
}
在程序中,有这样一些语句:
#include <stdio.h>
#include <stdlib.h>
int main(){
char *str="this is a string";
str++;
printf("%s",str);
return 0;
}
这里打印出来的结果是:his is a string
可见字符串常量的地址就是首字符的地址,且每个字符占一个地址。
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main(){
char *str="this is a string";
char string[]="this is another string";
strcpy(string,str);
printf("%s",string);
return 0;
}
这里打印出来的结果是:this is a string
里面用到了函数strcpy,这个函数是string copy的简写,顾名思义是将字符串进行复制,具体用法是在括号中,先写要被替换掉的字符串或其地址,在后面写用于替换的字符串或其地址。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char *str="this is a string";
char string[]="this is another string";
strcat(string,str);
printf("%s",string);
return 0;
}
这里用到了strcat函数,该函数的作用是将后面地址的字符串连接到前面地址的字符串后(且会自动删除末位的\0)
输出的结果是:this is another stringthis is a string
另外,如果尝试输出str串,会发现得不到任何结果,说明str地址内已经无内容了,全部被剪切到了string串那边。
还有需要注意的是,上面两个函数,都是不能对str进行的。
由于使用指针编写的字符串处理程序比使用数组方式更简洁,因此在c语言中,大量使用指针处理字符串。
下面来看几个例子
一、指针作函数形参,编写字符串复制函数
#include <stdio.h>
void strcopy(char *str1,char *str2){
while(*str2++=*str1++);
}
int main(){
char a[30],b[30];
printf("enter string:");
scanf("%s",a);
strcopy(a,b);
printf("a=%s\nb=%s\n",a,b);
return 0;
}
这段代码的运行结果是:字符串a与b的输出结果完全相同。
这里要注意指针操作的意义。*str1++的含义是先取出其指向的字符,再加1,因此可以通过这样的循环不断地将串1复制给串2。该程序的结束条件是:当串1的结束标志'\0'被赋给串2时结束。
二、编写函数求字符串长度
#include <stdio.h>
int strlength(char *str){
char *p=str;
while(*p){
p++;
}
return (p-str);
}
int main(){
char a[100];
int l;
printf("enter string:");
scanf("%s",a);
l=strlength(a);
printf("%d\n",l);
return 0;
}
三、编写串连接函数
#include <stdio.h>
char *strcat(char *str1, char *str2){
char *p=str1;
while(*p){
p++;
}
while(*p++=*str2++);
return(str1);
}
int main(){
char a[50],b[50];
printf("enter string1:");
scanf("%s",a);
printf("enter string2:");
scanf("%s",b);
printf("a+b=%s\n",strcat(a,b));
}
五、用指针对输入的一个字符串数组进行排序
六、合并两个有序字符串
#include<stdio.h>
int main(){
char str1[100],str2[100],str[100];
char *p,*q,*r,*s;
int i,j,n;
printf("enter string1:");
gets(str1);
printf("enter string2:");
gets(str2);
for(p=str1,q=str2;*p!='\0'&&*q!='\0';){
if(*p<*q) *r++=*p++;
else *r++=*q++;
}
s=(*p=='\0')?q:p;
while(*s){
*r++=*s++;
}
*r='\0';
puts(str);
return 0;
}