【2016.3.21】关于字符串的一点总结

本文详细介绍了C语言中字符串操作函数strcpy的使用方法、原理及常见问题解决策略,包括字符串复制过程、断言函数assert的作用、源字符串与目标字符串空间分配的重要性,以及如何避免常见错误,提供了深入理解并正确应用strcpy函数的指南。

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

今天重点学习了一下关于字符串的一些知识点,总结一下如下:

1.’\0’的ASCII值为0

可以利用这个特性判断字符串是否到末尾了。假设有字符数组str[],下面的while()可以判断字符数组是否结束。

int i = 0;
while(str[i])
{
    printf("%c",str[i]);
    i++;
}

2.关于strcpy函数

a).strcpy函数的原型
char *strcpy(char *strDest,const char *strSrc);

具体实现如下:

#include<assert.h>  //包含宏

...

char *strcpy(char* strDest,const char* strSrc)
{
    assert((strDest!=NULL)&&(strSrc!=NULL));
    char* temp = strDest;
    while((*strDest++=*strSrc++)!='\0')
    return temp;
}

其中

while((*strDest++=*strSrc++)!='\0')

不太好理解,可以理解为下面两种方式:

//第一种
while(1)
{
    char r;    
    *temp= *strSrc;    
    temp++;   
    strSrc++; 
    r = *strSrc;   
    if( '\0' == r )
      break;
}
//第二种
while ( *strSrc != '\0' )

{

  *temp++ = *strSrc++;

}

*strDestCopy=‘\0’;
b).void assert(int expression)函数

这个函数判断expression的值是否为真,如果值为真,则跳过,接着执行下一条语句,如果其值为假,则向stderr打印一条出错消息,然后通过调用abort函数来终止程序。

c).char strcpy(char strDest,char* strSrc)的()里面已经实现了对源字符串到目标字符串的复制,为什么还要返回char*?

答:是为了实现链式表达式,返回具体值,就像下面这样:
int length =strlen(strcpy(strDest,"hello world"));

d).在使用strcpy()函数时,必须预先为目标字符串分配足够的空间。

例:下面的程序会出现什么问题?[美国某著名软件公司面试题]

#include <iostream>
#include <cstdio>
int main(void)
{
    char s[]="123456789";
    char d[]="123";
    strcpy(d,s);
    printf("%s,\n%s",d,s);
    return 0;
}

实际运行结果如下:
这里写图片描述
可以看到源字符串即便是声明成const还是被截掉了一部分。原因在于目标字符串空间不够。先看一下s[]和d[]的地址是多少。

#include <iostream>
#include <cstdio>
int main(void)
{
    char s[]="123456789";
    char d[]="123";
    //strcpy(d,s);

    printf("address of s: %ld\n",(long int)&s);
    printf("address of d: %ld\n",(long int)&d);

    return 0;
}

运行结果:
这里写图片描述
可以看到s的地址是2686694,d的地址是2686690,因此有下图:

这里写图片描述

因此,d[]=”123456789\0”, s[] =”56789\0789\0”。输出是遇到\0即结束输出。

3.malloc()函数

malloc函数的原型为:void* malloc(unsigned int size);其作用是在内存的动态存储区中分配一个长度为size的连续空间。参数是一个无符号的整型数,返回值是一个指向所分配的连续存储域的起始地址的指针。如果函数没有成功分配空间,则会返回一个NULL并执行相应的操作。

free()函数与malloc()配套使用,原型为 void free(void* p)作用是释放p所指的内存区域。

转载于:https://www.cnblogs.com/zhengkang/p/5712420.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值