c语言 字符串

字符串

定义的几种格式
和整型数组略像 char str[] = “abcdefghijklnmopq”;
一般用char *p =“hello”
字符数组的存储方式
不能用sizeof来计算字符串中的有效个数(比实际多一个)
应该用strlen 在计算字符串个数时 遇到’\0’ 就结束计数

几种常用的API

1.输出字符串
puts();
printf("%s",p);
2.获取字符串
gets();
scanf("%s",p)
3.计算长度
strlen
4.初始化
memset
5.拷贝
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
6.拼接
char *strcat(char *dest, const char *src);
7.比较
int strcmp(const char *s1, const char *s2);//相同输出0
8.查找子字符
char *strchr(const char *s, int c);
9.查找子串
char *strstr(const char *haystack, const char *needle);

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{

	char *pstr;// 野指针 造成段错误 要进行初始化
	pstr = (char *)malloc(128); // 申请空间
	memset(pstr, '\0', 128); // 初始化

	printf("请输入字符串\n");
	gets(pstr);
	puts(pstr);
	
	int a = strlen(pstr);
	printf("字符串的长度:%d\n",a);

//	char *strcpy(char *dest, const char *src);

	char *strDest;
	strDest = (char *)malloc(128); // 申请空间
    memset(strDest, '\0', 128); // 初始化


	strcpy(strDest,pstr);

	printf("复制的字符串:%s\n",strDest);

	//char *strncpy(char *dest, const char *src, size_t n);
	memset(strDest, '\0', 128);
	int b;
	printf("复制前几个字符串:\n");
	scanf("%d",&b);
	strncpy(strDest, pstr, b);
	printf("复制的字符串:%s\n",strDest);

//	char *strcat(char *dest, const char *src);
	
	char *str = "lrm hen shuai";//只能进行读操作 不能写操作 否则段错误
//	strcat(str ,strDest);
	strcat(strDest, str);

	printf("组合后的字符串:%s\n",strDest);

//	int strcmp(const char *s1, const char *s2);

	if(strcmp(str, pstr) == 0){
		printf("相同哦\n");
	}else{
		printf("不相同哦\n");
	}
//  char *strchr(const char *s, int c);
	
	char *pstr2;
	pstr2 = (char *)malloc(128);
    memset(pstr2, '\0', 128); 
	pstr2 = strchr(str, 'r');
	puts(pstr2);
	
	char *pstr3;
    pstr3 = (char *)malloc(128);
    memset(pstr3, '\0', 128); 

//	char *strstr(const char *haystack, const char *needle);
	
	char *s = "hen";
	pstr3 = strstr(str,s);

    puts(pstr3);


	return 0;
}

10.转为小写的函数
strlwr
11.转为大写的函数
strupr

char str1[] = "Hello World";
    puts(strlwr(str1));
    puts(strupr(str1));

12.字符串分割
strtok
第一个 子串 strtok(str," “);
之后的子串 strtok(NULL,” ");

#include <stdio.h>
#include <string.h>

//	char *strtok(char *str, const char *delim);


int main()
{
	
    char str[128] = "lin rui miao";
	int i = 1;
	char *psubs[10];
    char *p = NULL;

	p = strtok(str," ");
    
    if(p != NULL){
		printf("获取到第1个串p=%s\n",p);
        psubs[i-1] = p; 
    } 
    while(1){
    p = strtok(NULL," "); 
    if(p != NULL){
		i++;
        printf("获取到第%d个串p=%s\n",i,p);
        psubs[i-1] = p; 
		}else{
			printf("没有子串了\n");
			break;
            
        }
    }
    
    int j;
    for(j=0;j<i;j++){
		puts(psubs[j]);
    }
	return 0;


}

自己实现一些api

gets puts strlen memset

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void myputs(char *p)
{
	
	while(*p != '\0'){
		putchar(*p++);
	}
}

int mygets(char *p)
{
	int cnt = 0;
	if(p == NULL){
		printf("输入非法\n");
		return cnt;
	}
	while(*p = getchar()){
		if(*p == '\n'){
			return cnt;
		}else{
			cnt++;
			p++;
		}
	}	
}
int mystrlen(char *p)
{
	int cnt = 0;
	while(*p != '\0'){
		cnt++;
		p++;
	}
	return cnt;
}

void mymemset(char *p,char c, int size)
{
	while(size){
		*p++ = c;
		size--;
	}
}

int main()
{
	char *p;
	int a;
	p = (char *)malloc(128);
	mymemset(p, '\0', 128);

	char a1[128] = "linruimiao";

	a = mygets(p);
	myputs(p);
	a = mystrlen(a1);
	printf("%d\n",a);	

	return 0;
}

strcpy strncpy strcat strcmp

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char *myStrcpy(char *str, const char *p)
{
	if(p == NULL || str == NULL){
		return NULL;
	}
	while(*p != '\0'){
		*str++ = *p++;
	}
	return str;
}
char *myStrncpy(char *str, const char *p, int size)
{
    if(p == NULL || str == NULL){
        return NULL;
    }
    while(*p != '\0' && size > 0){
		*str++ = *p++;
		size--;
    }
    return str;
}
char *myStrcat(char *dest, const char *src)
{
    while( *dest != '\0'){
		dest++;
    }
	while(*src != '\0'){
		*dest++ = *src++;
    }
    
	return dest;
}
int myStrcmp(char *a,char *b)
{
    if((NULL == a) || (NULL == b))
    {
        return -1;
    }
	while(*a== *b)
    {
        if(*a == '\0')
        {
            return 0;
        }
        a++;
        b++;
    }
    return *a-*b;
}
int main()
{
	char *p = "linruimiao";
	char str[128] = {'\0'};

//	myStrcpy(str,p);
	myStrncpy(str,p,3);
	puts(str);

	char *a = "123";
	strcat(str,a);
	printf("组合后的字符串:%s\n",str); 
	char *b = "12";
	int q = myStrcmp(b,a);
	if(q == 0){
		printf("相同哦\n");
	}
	printf("q=%d\n",q);
	
	
	
	return 0;
}

strchr strstr

#include <stdio.h>                                                                     
#include <stdlib.h>
#include <string.h>

char *myStrchr(char *str1, char c)
{
    while (*str1 != '\0')
    {
        if (*str1 == c)
        {
            return str1;
        }
        else
        {
            str1++;
        }
    }
}
char *myStrstr(char *s1, char *s2)
{
    char* p=s1;
    char *r=s2;
    while(*p != '\0')
    {
        while(*p == *r)
        {
            p++;
            r++;
        }
        if (*r == '\0')
            return s1;
        else{
            r=s2;
            p=++s1;
        }
    }
    return NULL;

}

int main()
{
    char *str = "linruimiao hen shuai";
    char *p;
    char *s = "rui";
    p = (char *)malloc(128);
    memset(p, '\0', 128);
    //  p = myStrchr(str, 'r');
    p = strstr(str,s);

    puts(p);

}
~   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值