C语言知识点总结

1、sizeof 与 stlen

sizeof()功能:计算数据空间的字节数
strlen()计算字符数组的字符数,以"\0"为结束判断,不计算’\0’;

char * s1 = "hello";
char s2[] = "hello";
char s3[100];
char* s4=(char*)malloc(100);
void *s5=(void*)malloc(100);
char str1[5]={'h','e','l','l','o'};
char str2[6]={'h','e','l','l','o','\0'};

sizeof(s1) = 4  
32位系统 指针大小都是4个字节(等于 int 类型的大小)
64位系统 指针大小都是8个字节

sizeof(s2) = 6
char s2[] = “hello” 这种类型的定义 编译器会在最后自动加上结束符'\0'
strlen(s2) = 5	只计算有效字符,结束符'\0'不计算

sizeof(s3) = 100 	1*100=100
计算数组所占空间的大小=一个元素占的空间*数组中的元素个数

sizeof(s4) = 4	指针所占空间大小都为4
sizeof(s5) = 4	指针所占空间大小都为4

sizeof(str1) = 5 计算数组大小 1*5 = 5
strlen(str1) = 未知 没有结束符'\0',结果可能是随机数

sizeof(str2) = 6 计算数组大小 1*6 = 6
strlen(str1) = 5 只计算有效字符,结束符'\0'不计算

2、strcpy strcmp strcat

strcpy 操作的字符串必须含有结束符’\0’
原型声明:char strcpy(char dest, const char *src);
头文件:#include <string.h> 和 #include <stdio.h>

功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串
参数:des为目标字符串,source为原字符串。
char* strcpy(char* des,const char* source)
{
	 char* r=des;
	assert((des != NULL) && (source != NULL));
	while((*r++ = *source++)!='\0');
	return des;
}

strcpy 会在字符串最后加上结束符’\0’
示例:

char a[] = "abcdefg";
char b[] = "ABC"

strcpy(a,b);

a的最终结果是: "ABC\0efg"

标准字符串库函数 操作的字符串必须含有结束符’\0’

strcmp(区分大小写)

功 能:串比较
用 法:int strcmp(char *str1, char *str2);
当s1<s2时,返回为负数;当s1=s2时,返回值= 0;当s1>s2时,返回正数

int strcmp(const char *str1,const char *str2)
{
    /*不可用while(*str1++==*str2++)来比较,当不相等时仍会执行一次++,
    return返回的比较值实际上是下一个字符。应将++放到循环体中进行。*/
    while(*str1 == *str2)
    {
        assert((str1 != NULL) && (str2 != NULL));                
        if(*str1 == '\0')
            return 0;        
        str1++;
        str2++;
    }
    return *str1 - *str2;
}

stricmp(不区分大小写)
实现的原理的 把所有的大写字母 转化成小写字母然后比较

大写字母比小写字母小32 小写字母大 (‘a’-‘A’ = 32)

int my_stricmp(const char *dst, const char *src)
{
   int ch1, ch2;
   do
   {
      if ( ((ch1 = (unsigned char)(*(dst++))) >= 'A') &&(ch1 <= 'Z') )
        ch1 += 0x20;
      if ( ((ch2 = (unsigned char)(*(src++))) >= 'A') &&(ch2 <= 'Z') )
        ch2 += 0x20;
   } while ( ch1 && (ch1 == ch2) );
   return(ch1 - ch2);
}

strstr

s1: 被查找目标 
s2: 要查找对象 
返回值:若s2是s1的子串,则返回s2在s1的首次出现的地址;
		如果s2不是s1的子串,则返回NULLchar *strstr(constchar*s1,constchar*s2)
{
    int n;
    if(*s2)
    {
        while(*s1)
        {
            for(n=0;*(s1+n)==*(s2+n);n++)
            {
                if(!*(s2+n+1))
                    return(char*)s1;
            }
            s1++;
        }
        return NULL;
    }
    else
        return (char*)s1;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值