转自:http://c.biancheng.net/view/342.html

表面上看strcpy和sizeof都是求字符串的长度,但是二者却存在着许多不同之处及本质区别

strlen是一个函数,用来计算指定字符串的长度,但不包括结束字符(即null字符)。原型为

size_t strlen(char const*str);

也正因为strlen是一个函数,所以需要进行一次函数调用,如:

char sArr[] = "ILOVEC";

printf("sArr的长度=%d\n",strlen(sArr));

上面的代码运行结果为6(因为不包括结束符号null)。这里需要特别注意的是,函数strlen返回的是一个类型为size_t的值,从而有可能让程序产生意想不到的结果。如:

if(strlen(x)>=strlen(y))

{

  /*程序*/

}

if(strlen(x)-strlen(y)>=0)

{

  /*程序*/

}

第一个程序能够完全按照预想的那样工作;但表达式2的结果永远为真,因为strlen的返回结果是size_t类型(无符号整型),因此绝对不可能是负数,即使表达式中同时包含了有符号整数和无符号整数,也会产生这种问题,因为有符号整数和无符号整数相加, 有符号的会转换成无符号的然后运算。

关键字 sizeof 是一个单目运算符,而不是一个函数。与函数 strlen 不同,它的参数可以是数组、指针、类型、对象、函数等,如下面的示例代码所示:

char sArr[]="ILOVEC"

printf("sArr的长度=%d\n",sizeof(sArr));

该代码运行结果为7(因为它包括结束字符null),对sizeof而言,因为缓冲区已经用已知字符串进行了初始化,其长度是固定的,所以sizeof在编译时计算缓冲区的长度。也正是由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。

sizeof与strcpy的区别的更多相关文章

  1. strncpy 和 strcpy的区别 (要抽时间重点看,未完待续)

    strcpy的实现: //GNU-C中的实现(节选): */ char* strcpy(char *d, const char *s) { char *r=d; while((*d++=*s++)); ...

  2. sizeof和strlen的区别

    一.sizeof    sizeof(...)是运算符,而不是一个函数.    sizeof操作符的结果类型是size_t,在头文件中typedef为unsigned int,其值在编译时即计算好了, ...

  3. Sizeof与Strlen的区别与联系

    转自:http://www.cnblogs.com/carekee/articles/1630789.html 一.sizeof    sizeof(...)是运算符,在头文件中typedef为uns ...

  4. Sizeof与Strlen的区别与联系(转)

    Sizeof与Strlen的区别与联系 一.sizeof     sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型 ...

  5. C++-sizeof和strlen的区别

    一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保 ...

  6. sizeof和strlen的区别和联系总结

    link:http://blog.csdn.net/ghevinn/article/details/9974967    strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头 ...

  7. 【转】Sizeof与Strlen的区别与联系

    原文地址:http://www.cnblogs.com/carekee/articles/1630789.html 1.sizeof  sizeof(...)是运算符,在头文件中typedef为uns ...

  8. C++Sizeof与Strlen的区别与联系

    一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保 ...

  9. Sizeof与Strlen的区别【转】

    本文转载自:http://www.cnblogs.com/carekee/articles/1630789.html Sizeof与Strlen的区别与联系 一.sizeof    sizeof(.. ...

随机推荐

  1. vscode 中 vue项目使用eslint插件 检查代码

    前言 本文章项目由vue-cli3创建 vscode版本1.36.1 eslint1.9.0 在网上找了一大堆文章,不知是什么原因,没有一篇可以直接使用的 折腾了许久,直接按eslint插件的说明,竟 ...

  2. C# 任务、线程、同步(一)

    static object taskMethodLock = new object(); static void TaskMethod(object title) { lock (taskMethod ...

  3. list,tuple,set,dict基础

    list # @Auther : chen # @Time : 2018/4/26 19:55 # @File : list_ex.py # @SoftWare : PyCharm # list1 = ...

  4. 参数类型 (Mapper.java)常用

    UserBaseInfo selectByMobile(@Param("mobile")String mobile,@Param("isDeleted")Int ...

  5. CF350E Wrong Floyd

    洛谷题目链接 前言: 这题其实真的不难 回归正题: 我们首先要明白$floyd$的思想,相信你都来做这道水题了,肯定不陌生,简单的手玩后,我们可以发现: 只要有任意一个点只跟非标记点相连的话,是更新不 ...

  6. C/C++应用--Window下获取硬件信息(CPU, 硬盘,网卡等)

    一.头文件如下: #include <Windows.h> #include <string> #include <iostream> #include <w ...

  7. Codeforces Round #571 (Div. 2)

    A. Vus the Cossack and a Contest 签. #include <bits/stdc++.h> using namespace std; int main() { ...

  8. LOJ166 拉格朗日插值 2【卷积,NTT】

    题目链接:LOJ 题目描述:输入多项式的次数$n$,一个整数$m$和$f(0),f(1),f(2),\ldots,f(n)$,输出$f(m),f(m+1),f(m+2),\ldots,f(m+n)$ ...

  9. ansible的become

    # ansible sudo 问题 官方下载centos7.6fcow2镜像不给直接远程ssh了,所以必须sudo,但是有的命令sudo也解决不了的如管道重定向还有多个命令组合. 解决办法: vim ...

  10. mac: jenkins+ant+jmeter接口测试

    最近研究Jenkins平台上使用ant进行集成测试,在网上查阅了很多资料,将 jenkins+ant+jmeter简单使用方法记录下来,方便以后查阅.有很多不足之处,后期不断优化. 一.环境搭建 1. ...