c语言小记--指针与字符串

本文详细介绍了C语言中字符指针的应用,涉及字符串常量地址理解、strcpy和strcat函数用法,以及通过指针实现字符串复制、长度计算和连接的示例。还探讨了如何使用指针作为函数参数、编写字符串相关函数,如复制和长度计算。
摘要由CSDN通过智能技术生成

字符指针可以指向一个字符串,可用字符串常量对字符指针进行初始化。例如:

#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;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shiroi hana

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值