C语言--(三)字符串处理(Lellansin)

(10)字符串处理

""  (里面什么都没写)里面存的\0
%c字符
%s字符串

字符要多数出一个\0



下面的第一中学是把第一中学的首地址赋给了字符数组

考虑下char *s = "第一中学"  与 char school[20] = "第一中学"   的区别

下面是把“i am happy”首地址给了hi[]
 

下面:通过指针直接获得每个字符串首地址

下面:碰到\0就会停止

常用输入输出库stdio.h

连接strcat      ()
拷贝strcpy     (copy)
比较strcmp   (compare)

// strcat()
// 关于char hi[20] 与 char *hi的正确使用
#include<stdio.h>

int main() {
    char hi[20] = "hello";  // 这样hi[]是有内存的,而直接使用 char *hi = "hello"是不行的
                            // 因为*hi 只指向了hello的首地址后面是没有内存的,不能用与连接
                            // 已经声明好了hi[20]有20个字符串格子,有足够的空间来strcat后面
                            // 的"Alice"
    char *name = "Alice";
    char str[256];
    printf("%s\n", strcat(hi, name));
}

// 错误示范    
#include<stdio.h>

int main() {
    char *hi = "hello";  // 这样hi[]是有内存的,而直接使用 char *hi = "hello"是不行的
                            // 因为*hi 只指向了hello的首地址后面是没有内存的,不能用与连接
    char *name = "Alice";
    char str[256];
    printf("%s\n", strcat(hi, name));
}

strcpy()

// strcpy()
#include<stdio.h>

int main() {
    char hi[20] = "hello";  



    char *name = "Alice";
    char str[256] = "alan nihao";
    strat(hi, name);
    printf("%d", hi);
    
    printf("%s\n", strcpy(str, "come on"));  //
}

strcmp()

// strcmp()
#include<stdio.h>

int main() {
    char hi[20] = "hello";  
                            
                            
    char *name = "Alice";
    char str[256] = "alan nihao";
    strat(hi, name);
    printf("%d", hi);
    
    printf("%s\n", strcpy(str, "come on")); 

    printf("%d\n", strcmp("hello","hello"));  // strcmp()返回的是int型的整数   这里是%d

    printf("%d\n", strlen(str));  // 返回的是7, come on 没有算上\0
    
    printf("%d\n", strupr(str));  //小写变成大写
}

 

因为都是hello所以返回0

strcmp("zello", "hello");

比较z和h的ascii码大小

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

int main() {
    do{
        printf("please input your password:\n");
        scanf("%s", str);
    }while(strcmp(str, "asdf1234"));
    printf("password is correct\n");  // "asd123"=="asd123"是不行的,貌似因为地址不同
}

sprintf(str, "%s %d", hi, name)

// strcmp()
#include<stdio.h>

int main() {
    char hi[20] = "hello";                                                         
    char *name = "Alice";
    char str[256];
    
    printf("%s\n", hi);

    sprintf(str, "%s %s", hi, name);  // 先赋给%s %s然后都给到str
    
    printf(str);
}

// strcmp()
#include<stdio.h>

int main() {
    char hi[20] = "hello";                                                         
    char *name = "Alice";
    char str[256];
    
    printf("%s\n", hi);
    sprintf(str, "%s %s", hi, name);  // 先赋给占位符%s %s , 然后都给到str
    
    int i;
    for(i = 0; i<5; i++) {
    sprintf(str, "%s %d", name, i);
    printf(str);
    }    
    
}

总结

调用自己写的函数,这里使用了省略写法

void function(int *x, int *y) {

}

int main() {

    swap(&i, &j);

}

统计字符有几个

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


int mestrlen(char *aim);  // 需要提前声明

int main() {
    printf("%d", mystrlen("hello"));
}

int mystrlen(char *aim) {  // 如果定义在主函数后面,需要提前声明
    int count;
    while(*aim != "\0") {
        aim++;
        count++;
    }
    return;
}

输出是5

1.另外一种写法

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


int mestrlen(char *aim);  

int main() {
    printf("%d", mystrlen("hello"));
}

int mystrlen(char *aim) {  
    int count;
    while(*aim++ != "\0") {  // 这里的改动是判断完了再+,所以等同于上面的
        count++;
    }
    return count;
}

 

结果是5

因为

printf("%d", '\0');

输出是0,就是假

2.另外一种写法

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


int mestrlen(char *aim);  

int main() {
    printf("%d", mystrlen("hello"));
}

int mystrlen(char *aim) {  
    int count;
    while(*aim++) {  // 这里的改动是判断完了再+,当等于'\0'时就是假,不再循环
        count++;
    }
    return count;
}

 

结果是5

3.另外一种写法

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


int mestrlen(char *aim);  

int main() {
    printf("%d", mystrlen("hello"));
}

int mystrlen(char *aim) {  
    int count;
    while(*aim++) {  // 这里的改动是判断完了再+,当等于'\0'时就是假,不再循环
        count++;
    }
    return count;
}

结果是5

4.另外一种写法

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


int mestrlen(char *aim);  

int main() {
    printf("%d", mystrlen("asdf"));
}

int mystrlen(char *aim) {  
    int count;
    char *tmp = aim;  // 现在aim是hello首地址,给了tmp  ?
    while(*aim++) {  // 这里的改动是判断完了再+,当等于'\0'时就是假,不再循环
        count++;
    }
    return aim-tmp;  // 用aim现在新的地址减去原来aim的地址
}

结果是5,因为使用asdf后面的\0 的位置5 减去了首地址=5

如果是"hello world"结果是12

https://www.bilibili.com/video/av395183  62分钟

后面的内容,up主自己没弄清楚~

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

计算机视觉-Archer

图像分割没有团队的同学可加群

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

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

打赏作者

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

抵扣说明:

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

余额充值