浙大翁恺C语言学习笔记——字符串

字符串

以0结尾的一串字符;0或'\0'(整数0)是一样的,但是和'0'(ASCII码中的0)不同
0标志字符串的结束,但它不是字符串的一部分;计算字符串长度的时候不包含这个0
字符串以数组的形式存在,以数组或指针的形式访问;更多的是以指针的形式
string.h 里有很多处理字符串的函数

字符串常量

char *str =“Hello"

char word[] =“Hello"

char line[10] =“Hello"   //“Hello" 这个字符串在数组中长度为6(系统会自动补上结尾的0)

两个相邻的字符串常量会自动连起来

C语言的字符串是以字符数组的形态存在的

不能用运算符对字符串做运算

通过数组的方式可以遍历字符串

唯一特殊的地方是字符串字面量可以用来初始化字符数组
 

指针指向的字符串为只读变量(const)

char *s = "Hello,world ! " ;
s 是一个指针,初始化为指向一个字符串常量
由于这个常量所在的地方,所以实际上s是const char *s ,但是由于历史的原因,编译器接受不带const的写法
但是试图对s所指的字符串做写入会导致严重的后果

如果需要修改字符串,应该用数组:
char s= "Hello,world! " ;

字符串可以表达为char*的形式;char*不一定是字符串
本意是指向字符的指针,可能指向的是字符的数组(就像int*—样)
只有它所指的字符数组有结尾的0,才能说它所指的是字符串
 

如果要构造一个字符串—>数组

如果要处理一个字符串—>指针

字符串的输入输出
char*t = "title";
char *s;
s = t;
//并没有产生新的字符串,只是让指针s指向了t所指的字符串,对s的任何操作就是对t做的
char string[8];

scanf("%s", string);

printf("%s", string);

//scanf读入一个单词(到空格、tab或回车为止),但scanf不知道读入的内容的长度 
char string[8];
scanf("%7s", string);
//表示string只能读取最多7位的字符串
//在%和s之间的数字表示最多允许读入的字符的数量,这个数字应该比数组的大小小一

*****定义了字符串指针后一定要初始化为0*****

空字符串

char buffer[100] = "" ;
这是一个空的字符串,buffer[0] ==‘\0’

char buffer[ ] = "" ;
这个数组的长度只有1

字符串数组

char **a;        //a是一个指针,指向另一个指针,那个指针指向一个字符(串)

char a[][] ;        //二维数组

char *a[] ;         //a[0]相当于char *(一个指向一个字符串的指针),a[1],a[2]...同


单字符输入输出

putchar:从标准输出写一个字符,返回写了几个字符,EOF表示写失败

int putchar(int c);

getchar:从标准输入读一个字符,返回类型是int是为了返回EOF

int getchar(void);

C标准库string.h部分函数
strlen:

size_t strlen(const char *s);
返回s的字符串长度(不包括结尾的 \0 )

int mylen(const char *s ){
    int cnt = 0;
    while (s[cnt] != '\0') {
    cnt++;
    }
    return idx;
}
//此函数与strlen功能相同(字符串结尾为\0—)
strcmp:

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

比较两个字符串,返回:
0 : s1==s2
1 : s1>s2
-1: s1<s2

int mycmp( const char* s1,const char* s2){
    int idx = 0;while ( 1 ) {
        if ( s1[idx] != s2[idx] ) {
            break;
        }else if ( s1[idx] == '\0') {
            break;
        }
        idx ++;
    }
    return (s1[idx] - s2 [idx]);
}
//此函数与strcmp功能相同(数组版)
int mycmp( const char* s1,const char* s2){
  
    while (*s1 ==*s2 && *s1 != '\0') {
    s1++;
    s2++;
    }

    return (*s1 - *s2);
}
//此函数与strcmp功能相同(指针版)
strcpy

char * strcpy(char *restrict dst, const char *restrict src);
把src的字符串拷贝到dst(restrict表明src和dst地址无重叠)
返回dst(为了能链起代码来)

char *dst = (char*)malloc(strlen(src)+1);
strcpy(dst, src);
//复制一个字符串
char* mycpy( charx dst,const char* src){
    int idx = 0;
    while ( src[idx] != '\0') {
        dst[idx] = src[idx];
        idx++;
    }
    dst [idx] = '\0';
    return dst;
}
//此函数与strcpy功能相同(数组版)
char* mycpy( charx dst,const char* src){
    char* ret = dst;
    while (*src != '\0') {
        *dst =*src;
        dst++;
        src++;
    }
    *dst = '\0';
    return ret;
}
//此函数与strcpy功能相同(指针版)
字符串中找单个字符
char * strchr(const char *s, int c);        //返回从左数第一个字符(int c)的指针
char * strrchr(const char *s, int c);       //返回从右数第一个字符的指针
//返回NULL表示没有找到
int main(int argc, char const *argv[]){
    char s[] = "hello";
    char *p = strchr(s,'l');     //返回'hello'中第一个'l'的指针
    p = strchr(p+1,'l');    //返回'hello'中第二个'l'的指针
    printf ( "%s\n", p);
    return 0;
}
//找第二个字符的方法

char * strstr(const char *s1, const char *s2);        //字符串中找字符串

char * strcasestr(const char *s1, const char *s2);        //忽略大小写寻找字符串

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值