【C语言复习(十四)】C语言中的字符串

本文探讨了C语言中字符串的概念,强调它们是以''结束的字符数组。解释了字符串长度的定义及如何计算,包括strlen()函数的工作原理,并通过示例指出类型匹配的重要性。此外,文章还介绍了如何用单条语句实现strlen函数的简化版,以及字符串复制函数strcpy的自定义实现思路。
摘要由CSDN通过智能技术生成

1、C语言中的“字符串”

严格来讲,C语言中不存在字符串数据类型,都是以字符数组来模拟字符串的;

C语言中字符串是以’\0’结束的字符数组;

C语言中的字符串可以分配于栈空间、堆空间、或者只读存储区;

如下示例:

#include <stdio.h>
#include <malloc.h>
int main()
{
    char str1[]={'H','e','l','l','o',' ','W','o','r','l','d'};
    //str1不是字符串,因为它不包含'\0',它只是一个字符数组
    char str2[]={'H','e','l','l','o',' ','W','o','r','l','d','\0'};
    char* str="Hello World!";
    char *pstr=(char*)malloc(sizeof(char)*20);
    char* p=str2;
    char* p1=pstr;
    while(*p!='\0')
    {
        *p1=*p;
        p++;
        p1++;
    }
    printf("%s\n",pstr);
    return 0;
}

2、字符串的长度

2.1基本概念:

字符串的长度指的是字符串中所包含的字符的个数,在C语言中即是字符串中第一个’\0’出现前的字符个数,不包含这个’\0’结束符;

C语言通过’\0’结束符来确定字符串长度;

定义字符指针变量并初始化时,不用手动添加这个结束符’\0’,编译器会默认添加;

2.2、测量字符串长度?

C语言标准库函数string.h头文件中已经有一个函数strlen()可以完成这个工作,那么如何自己实现strlen()函数呢?

#include <stdio.h>
#include <assert.h>
 
size_t _strlen(const char* str)
{
const char* p = str;
size_t length = 0;//typedef _W64 unsigned int   size_t;
assert(str);
while (*p++ != '\0')
{
length++;
}
return length;
}
 
int main()
{
char* s = "Hello World!";
printf("%d\n", _strlen(s));
return 0;
}

注意,和标准库提供的strlen函数一样,这里的返回值为size_t类型,通过查看定义可知它是一个无符号整型,因此使用时注意!如下就有错误:

#include <stdio.h>
#include <string.h>
int main()
{
char* s = "Hello World!";
char* s1 = "Hello";
if (strlen(s1) >= strlen(s))
{
printf("%s\n", s1);
}
else
{
printf("%s\n", s);
}
if ((strlen(s1) - strlen(s)) >= 0)
{
printf("%s\n", s1);
}
else
{
printf("%s\n", s);
}
return 0;
}

运行结果:

分析程序,两个条件判断初看都应该会输出完整的”Hello World!”;可是为什么第二个条件判断却输出了”Hello”??

问题出在了strlen函数的返回值类型上,size_t类型实际上是一个unsigned int类型,那么第二个条件语句中:strlen(s1) - strlen(s),计算的结果也是一个无符号的整数,因此它一定大于等于0

 

3、动手操作

3.1、用一条语句实现strlen函数

上面,我已经给出了一个实现strlen函数的方法,要想用一条语句实现,我们可以试着对它进行精简和改进:

先给出最终的实现:

int _strlen(const char* str)
{
return (assert(str), (*str != '\0' ? _strlen(str + 1) + 1 : 0));
}

简单分析一下:

回顾一下,上面的第一个方法,原理是当前指针所指向的存储单元的值不为’\0’那么长度就加1,知道遇到’\0’就停止。

现在要求用一条语句,肯定不能再使用这种方法,要换一种算法并配合递归调用,基本原理是:如果当前指针指向的存储空间的字

符不为‘\\0’,那么整个字符串的长度就应该等于指针str+1所指向的长度+1;利用这种算法加递归调用配合三目运算符就可以实现

了,但是在计算字符串长度前,应该进行安全性检查,判断字符串是否为空,因此还要配合逗号表达式,最终的结果如上所示!

3.2自己实现strcpy函数

char* _strcpy(const char* str,const char* newstr)
{
    char* p=newstr;
    assert(str);
    while((*p++ = *str++)!='\0');
 
    return newstr;
}

只是注意上面的while循环就行,其他都比较简单!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值