C programming - 字符数组和字符串

目录

  • 如何存储字符串?
  • 字符数组与字符串有何区别?
  • 字符串操作函数
  • 使用指针数组存放字符串
  • 易混淆内容


<一> 如何存储字符串

C中字符串使用字符数组进行存储,未初始化的部分补 '\0',如果没有指定数组大小,字符串初始化时最后会额外存储 '\0' 。

char c1[10] = "hello!";
char c2[10] = {'h','e','l','l','o','!','\0'};

if(c1[9]=='\0'&&c1[9]==NULL&&c1[9]==0&&NULL=0){
    puts(c1);
}

<二> 字符数组与字符串有何区别

字符串只是简化了初始化字符数组的方法,在上方程序中,c2初始化时及时最后不指定 '\0' ,编译器会将剩余未初始化的内容置0;

char c1[] = "hello!hello!";
char c2[] = {'h','e','l','l','o','!','h','e','l','l','o','!'};

printf("%i",sizeof(c1));    //13
printf("%i",sizeof(c2));    //12

<三> 字符串操作函数

1> 字符串转换为长整型long、long long (当前函数声明位于stdlib.h头文件中)

使用示例:

char s1[10] = "99886";
char *endptr;
long a = strtol(s1,&endptr,10);
printf("%i\n",a);

2> 字符串求长(当前函数声明位于string.h头文件中)

int len1 = strlen(s1);

int len2 = 0;
for(len2=0;s2[len2];len2++);

printf("%i %i\n",len1,len2);

3> 字符串复制(当前函数声明位于string.h头文件中)

strcpy(s1,s2);  //将s1复制到s2

puts(s1);
puts(s2);

4> 字符串合并(当前函数声明位于string.h头文件中)

char *s3 = strcat(s1,s2);    //将s2拼接在s1后方

puts(s3);

5> 字符串倒置(手动实现)

#include <stdio.h>

int main(){
    char s1[10] = "hello!";
    int i = 0;
    for(;s1[i];i++);
    for(int j=0;j<i/2;j++){
        int temp = s1[j];
        s1[j] = s1[i-j-1];
        s1[i-j-1] = temp;
    }   
    puts(s1);
    return 0;
}

6> 字符串清空

memset(buffer,0,sizeof(buffer));    //string.h

7> 字符串分隔 strsep

注意:只能分隔单标记!但可以转换为整数求和(空格会被转换为0!)

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

int main(){
    char s[] = "aaa bbbb cccc";
    char *sp,*token;
    sp = s;

    printf("%p\n",s[4]);

    while((token = strsep(&sp," "))!=NULL)
        printf("%s ",token);
        printf("%p***\n",token);

    return 0;
}

详细使用说明:

  • 为什么要传入二级指针? 为了在函数中修改函数外的字符串!
  • token返回分割后的字符串首地址,地址与原字符串保持一次,长度为分割后字符串的长度;
  • sp指向分割后的下一个字符串首地址;
  • 注意:原字符串会被替换为第一个token!

8> 字符串比较 strcmp

成功返回0,失败返回-1;

<四> 使用指针数组存放字符串

#include <stdio.h>

void show(char *a[],int n){ 
    for(int i=0;i<n;i++){
        puts(a[i]);
    }   
}
void show2(char **a,int n){
    for(int i=0;i<n;i++){
        puts(a[i]);
    }
}

int main(){
    char *a[] = {"hello","world","love","you"}; 
    char *b[] = {"hello","world","love","you"};
    show(a,4);
    show(b,4);
    return 0;
}

程序解析:

指针数组即数组内部存放的是指针,而不是值;当作为函数参数时,有两种形式可以表示形参(见上述示例);

<五> 易混淆内容

int (*p)[5]:名为p的指针,指向列为5的二维数组

int *p[5]:指针数组(数组内部存放的是指针,常用于存放多个字符串)

int (*p)():名为p的指针,指向一个函数

int *p():函数名为p的函数,返回int型指针

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值