字符数组和字符串

这篇博客探讨了C语言中字符数组和字符串的区别,强调了字符串以''作为结束标志。通过示例解释了如何判断字符数组是否为字符串,并指出了使用printf输出字符串的注意事项。此外,还讨论了字符串长度的计算,提到了strlen函数和sizeof运算符的不同。最后,博主提醒了strcpy函数的安全隐患,强调了防止数组越界的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.字符数组和字符串的定义
字符数组 :字符数组是由char类型定义的数组

字符串:是由" "包括起来的字符序列 字符串的结束标志是'\0'

2.如何区分字符数组和字符串

eg;

char str1[10] = { 'a','b','c','d','e','f','g','h','i','j' };//字符数组,不是字符串
原因:  是由char 类型定义的数组, 但容量为10 ,没有'\0'的位置
    char str2[10] = { 'a','b','c','d','e','f','g','h'};//字符数组,是字符串

原因:  是由char 类型定义的数组, 给了10的容量 但里面的元素只占八个 ,后面的值为0 因为是char类型 所以后面为'\0' 符合字符串
    char str3[] = { 'a','b','c','d','e','f','g','h' };//字符数组,不是字符串

原因 是由char 类型定义的数组,但是数组是给多少元素就有多少容量
  
 char str4[10] = "abcde";//字符数组,是字符串

原因 是由char 类型定义的数组,并且为" "所以是字符串
  
 char str5[] = "abcde";//字符数组,是字符串
原因 是由char 类型定义的数组,并且为" "所以是字符串
    const char* str6 = "abcde";//不是字符数组,是字符串

原因 不是由char类型定义的数组,并且为" "所以是字符串
    char str7[] = { 'a','b','c','d','\0','e' };//是字符数组,是字符串
原因 是由char 类型定义的数组,而且有'\0'

但是 

printf("%s\n",str7); 结果是 abcd '\0'代表着字符串的结束

str2[1] = 0;
    printf("%s\n",str2);//考题

输出结果为 a

总结 

1.判断字符数组是否为字符串 就得看他末尾有没有'\0'

2.'\0',0,false,null 都代表这 0

3.printf("%s\n",arr)//%s 输出字符串

4.%s 用来输出字符串,如果不是字符串那么输出会出错

三.字符串占字节的长度与字符串长度判断

char str1[100] = "abcde";
    char str2[] = "abcde";
    char str3[] = "abcd\0e";
    char str4[] = "abcd\0e\n";
    printf("%d,%d\n",sizeof(str1),strlen(str1));//100,5
    printf("%d,%d\n", sizeof(str2), strlen(str2));//6,5
    printf("%d,%d\n", sizeof(str3), strlen(str3));//7,4
    printf("%d,%d\n", sizeof(str4), strlen(str4));//8,4

总结 1.字符串的字节长度需要把隐藏的'\0'算上

         2.字符串的长度 在'\0'结束前判断 字符串有几个元素 长度就为多少

四.字符串函数 

复制函数,因为字符串不能整体复制,所以只能将字符串的元素一个一个进行复制

void Mystrcpy(char des[], char src[])
{
    int i;
    for (i = 0; src[i] != '\0'; i++)
    {
        des[i] = src[i];
    }
    des[i] = '\0';
}

库函数提供了专门复制字符串的函数:strcpy

但是其函数不够安全 因为它容易越界导致程序崩溃
eg:
char str[10];

strcpy(str,"hello world");

因为str的容量只有10个字节 ,但是 "hello world"有12个字节

所以str容量太小 数组越界  导致程序崩溃

总结 
1.字符串的遍历 : for(int i=0;str[i]!='\0';i++)
2.注意 strcpy的越界问题

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值