C语言风格字符串

C语言风格字符串


这里写图片描述


字符串的长度:

  • C语言风格的字符串末尾有一个‘\0’。
  • 比如: char * = "HelloWorld";
    在堆内存中会有一个字符数组,它存储的是“HelloWorld”末尾有一个“\0”
    在栈内存中会有一个字符指针,名字为str指向字符数组0号位置的字符‘H’
    如下图所示:

这里写图片描述

  • 那么如何求字符串的长度呢?
  • 定义一个指针p指向0号位置,然后再定义一个变量初始化为0;把指针p不断往后移动,移动的过程中将那个变量不断加一;最终p所指向的字符是’\0’;这时候停止循环返回定义的变量的值。

求字符串的长度的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int Max=32;
//求字符串的长度
int strLength(char* str){
    int count=0; //count记录字符串的长度
    char* p=str; //定义一个指针指向第一个字符
    while(*p++){ //当p没有指向'\0'时,则一直循环往后移动,直到指向'\0'
        count++; //移动的过程中count增大
    }
    return count;
}
int main(int argc, char **argv) {
    char* str=(char*)malloc(sizeof(char)*Max);
    scanf("%s",str);
    printf("%d %d\n",strLength(str),strlen(str));  //strLength为我们自定义的求长度的方法,strlen为c语言自带的方法
    return 0;
}

字符串的拷贝:

  • 当考虑目标字符串dest比源字符串src短时:

这里写图片描述

  • 当考虑目标字符串dest比源字符串src长时:

这里写图片描述

求字符串的拷贝的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int Max=32;
//字符串的拷贝
void strCopy(char* dest,char* src){ 
    char* p=dest;
    char* q=src;
    while(*p++=*q++){ //不断把q所指向的字符向p所指向的字符移动,直到q所指向的字符为'\0'

    }
}
int main(int argc, char **argv) {
    char* dest=(char*)malloc(Max*sizeof(char));
    char* src=(char*)malloc(Max*sizeof(char));
    gets(dest);
    gets(src);
    strCopy(dest,src);  //自己编写的字符串拷贝函数
    printf("%s\n",dest);
    free(dest);
    free(src);
    dest=(char*)malloc(Max*sizeof(char));
    src=(char*)malloc(Max*sizeof(char));
    gets(dest);
    gets(src);
    strcpy(dest,src);  //c语言自带的字符串拷贝函数
    printf("%s\n",dest);
    free(dest);
    free(src);
    return 0;
}

字符串的连接:

这里写图片描述

  • 首先要保证目标串的尾部,有足够的空间容纳源字符串;
  • 步骤:
  • 1.求目标字符串的长度
  • 2.将源字符串复制到目标串的尾部

字符串的连接的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int Max=32;
//字符串的连接
void strCat(char* dest,char* src){
    int len=strlen(dest); //求目标字符串的长度
    char* p=dest+len; //指针指向目标串的末尾,也就是指向dest字符串的'\0'的位置
    strcpy(p,src);  //将源串拷贝至目标串末尾
}
int main(int argc, char **argv) {
    char* dest=(char*)malloc(Max*sizeof(char));
    char* src=(char*)malloc(Max*sizeof(char));
    gets(dest);
    gets(src);
    strCat(dest,src);  //自己编写的字符串的连接
    printf("%s\n",dest);
    free(dest);
    free(src);
    dest=(char*)malloc(Max*sizeof(char));
    src=(char*)malloc(Max*sizeof(char));
    gets(dest);
    gets(src);
    strcat(dest,src);   //c语言自带字符串的连接
    printf("%s\n",dest);
    free(dest);
    free(src);
    return 0;
}

字符串的比较:

  • 原则:相等返回0,小于返回-1,大于返回1
  • 方法:
  • 1.定义两个指针,分别指向两个字符串
  • 2.两个指针往后移动,直到指向的连个字符不相等时比较大小
  • 3.当都指向了末尾,且之前的都相等,则返回0;
  • 4.当长度不相等,且两个指针有一个指向的’\0’,则长度长的大

字符串的比较的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int Max=32;
//比较两个字符串的大小
int strCompare(char* s1,char* s2){
    char* p=s1;
    char* q=s2;
    while(*p==*q&&*p&&*q){  //当指向的字符相等,且都没有指向末尾'\0'时则循环往后移动指针
        p++;
        q++;
    }
    if(*p-*q==0){ //当都指向末尾'\0'时,则相等
        return 0;
    }else{
        return *p>*q?1:-1; //指向的字符不等时,比较大小;或者有一个指向'\0'也比较大小
    }
}
int main(int argc, char **argv) {
    char* s1=(char*)malloc(Max*sizeof(char));
    char* s2=(char*)malloc(Max*sizeof(char));
    gets(s1);
    gets(s2);
    printf("%d\n",strCompare(s1,s2));  //自己写的字符串比较函数
    free(s1);
    free(s2);
    s1=(char*)malloc(Max*sizeof(char));
    s2=(char*)malloc(Max*sizeof(char));
    gets(s1);
    gets(s2);
    printf("%d\n",strcmp(s1,s2));   //系统自带的字符串比较函数
    free(s1);
    free(s2);
    return 0;
}

字符串的大小写转换:

  • 大写转化为小写:指针指向的字符加上32
  • 小写转化为大写:指针指向的字符加减32

字符串的大写转化为小写:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int Max=32;
//字符串转小写
void strLower(char* s){
    char* p=s;
    while(*p){
        if(*p>='A'&&*p<='Z'){
            *p+=32;  //遇到大写字符,加上32
        }
        p++;
    }
}
int main(int argc, char **argv) {
    char* s=(char*)malloc(Max*sizeof(char));
    gets(s);
    strLower(s);  //自己写的大写转化为小写
    printf("%s\n",s);
    free(s);
    s=(char*)malloc(Max*sizeof(char));
    gets(s);
    strlwr(s);  //c语言自带转化为小写
    printf("%s\n",s);
    free(s);
    return 0;
}

字符串的小写转化为大写:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int Max=32;
//字符串转大写
void strUper(char* s){
    char* p=s;
    while(*p){
        if(*p>='a'&&*p<='z'){
            *p-=32;  //遇到小写字符,减去32
        }
        p++;
    }
}
int main(int argc, char **argv) {
    char* s=(char*)malloc(Max*sizeof(char));
    gets(s);
    strUper(s); //自己写的小写转化为大写
    printf("%s\n",s);
    free(s);
    s=(char*)malloc(Max*sizeof(char));
    gets(s);
    strupr(s); //c语言自带转化为大写
    printf("%s\n",s);
    free(s);
    return 0;
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完成 MyString 类的实现,使程序正确运行 #include <iostream> #include <cstring> using namespace std; class MyString { public: // 无参构造函数 MyString(); // 构造函数,传入一个C语言风格字符串 MyString(const char *s); // 拷贝构造函数 MyString(const MyString &s); // 析构函数 ~MyString(); // 将C语言风格字符串赋值给MyString对象 MyString& operator=(const char *s); // 将一个MyString对象赋值给另一个MyString对象 MyString& operator=(const MyString &s); // 将这个MyString对象与C语言风格字符串相连 MyString& operator+=(const char *s); // 将这个MyString对象与另一个MyString对象相连 MyString& operator+=(const MyString &s); // 返回下标为pos的字符 char& operator[](int pos); // 返回子串 [pos, pos+count) // 若请求的子串越过字符串的结尾,即count大于size() - pos,则返回的子串为[pos, size()) // 若pos不在字符串的下标范围内,返回空的MyString对象 // 若count == -1,返回子串[pos, size()) MyString substr(int pos = 0, int count = -1); // 字符串的长度 int size() const; // 返回C语言风格字符串 const char* c_str() const; private: char *m_buf; int m_size; }; // 请在此处填写 int main() { char s[101]; cin.getline(s, 101); int pos, count; // 创建、拷贝、赋值 MyString s1(s), s2(s1), s3, s4, s5; s3 = s; s4 = s1; cout << "s1: " << s1.c_str() << endl; cout << "s2: " << s2.c_str() << endl; cout << "s3: " << s3.c_str() << endl; cout << "s4: " << s4.c_str() << endl; // 拼接 s3 += s; s4 += s1; cout << "s3 += s: " << s3.c_str() << endl; cout << "s4 += s1: " << s4.c_str() << endl; // 下标 cin >> pos; s4[pos] = 'm'; cout << "s4[pos] = 'm': " << s4.c_str() << endl; // 取子串 cin >> pos >> count; s5 = s4.substr(pos, count); cout << "s5: " << s5.c_str() << endl; // 以后还可以重载<<直接输出一个MyString对象哦 TODO return 0; }
06-11

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值