当前位置:首页 > 开发 > 移动开发 > 正文

C语言 sizeof和strlen之间的那些事 C/C++软件开发求职面试题 必备考点(一)

发表于: 2012-08-07   作者:aijuans   来源:转载   浏览:
摘要:         找工作在即,以后决定每天至少写一个知识点,主要是记录,逼迫自己动手、总结加深印象。当然如果能有一言半语让他人收益,后学幸运之至也。如有错误,还希望大家帮忙指出来。感激不尽。        后学保证每个写出来的结果都是自己在电脑上亲自跑过的,咱人笨,以前学的也半吊子。很多时候只能靠运行出来的结果再反过来

        找工作在即,以后决定每天至少写一个知识点,主要是记录,逼迫自己动手、总结加深印象。当然如果能有一言半语让他人收益,后学幸运之至也。如有错误,还希望大家帮忙指出来。感激不尽。

       后学保证每个写出来的结果都是自己在电脑上亲自跑过的,咱人笨,以前学的也半吊子。很多时候只能靠运行出来的结果再反过来总结,再结合书上讲的,才能融为自己的。环境为:Fedora14  GCC / g++编译器 32位

     第一课,就来搞sizeof和strlen吧。

sizeof是一个单目操作符,而不是函数。作用是计算其操作数的存储空间。操作数可以是一个表达式或者一个类型。如sizeof(int)。而strlen是一个函数,只能用char *做参数,且必须是以'\0'结尾的,计算有效字符串的字符数。

示例:

#include <stdio.h>
void main()
{
   char str[]="yanguoqi";
   char *p = str;
   printf("sizeof(str) = %d\n", sizeof(str));
   printf("strlen(str) = %d\n", strlen(str));
   printf("sizeof(p) = %d\n", sizeof(p));
    printf("strlen(p) = %d\n", strlen(p));
}

[root@localhost learn]# gcc test.c -o out
test.c: 在函数‘main’中:
test.c:7:33: 警告:隐式声明与内建函数‘strlen’不兼容

运行结果:

[root@localhost learn]# ./out 
sizeof(str) = 9: sizeof是返回的保证能容纳实现所建立的最大对象的字节大小。在32位pc下,一个字符占一个字节,

一共8个字符,加最后的'/o'.共9个字节。 


strlen(str) = 8:  这是有效字符的个数,不把'/0'算在内。
sizeof(p) = 4:   这里p是一个指针型变量,在32位PC下占4个字节。一般指针都占4个字节。
strlen(p) = 8:   同上。

再试下能想到的其他情况,

char *p = “yanguoqi”

sizeof(p)=4

strlen(p)=8,

char str[100] = "yanguoqi",strlen(str)=8,sizeof的结果应该是100.

int p[100], sizeof(p) = 100*4,strlen会报错。

最后来看个迷惑性强的,

void fun(char str[100])

{

     sizeof(str)=???

}

     这里还是等于4,str是函数的参数,sizeof运算的时候将其当成了指针。而指针占4个字节。对于何种类型的指针,sizeof出来的大小都是固定的,32位pc下总是4.

     最后再如,char *p = "helloevery",在计算这种指针指向的字符串长度的时候,只能用strlen结果为10.

      一定要区分数组元素的个数,字符串长度两个概念的区别,后者不带'\0'.

下面是个小例子,加深下印象。函数void upgrade(str[]),将str中小写字母改成大写字母。



#include <iostream>
#include <string.h>


using namespace std;
void upgrade(char str[])
{
   for(int i=0; i<strlen(str); i++)    
      if('a'<=str[i]&&str[i]<='z')
      //str[i] = str[i] + ('A' - 'a');
       str[i]+='A' - 'a';
}
int main()
{
    
    char str[] = "HellEveryOne";
    cout<<str<<endl;
    upgrade(str);
    cout<<str<<endl;
    return 0;
}

linux下,c++程序后缀名可以不改为.cpp,用.c,  但一定要用g++来编译,而且要想用strlen必须加#include <string.h>.

[root@localhost learn]# g++ test.cpp -o out
[root@localhost learn]# ./out 
HellEveryOne
HELLEVERYONE

C语言 sizeof和strlen之间的那些事 C/C++软件开发求职面试题 必备考点(一)

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
strlen是函数,而sizeof是算符。strlen需要进行一次函数调用,而对于sizeof而言,因为缓冲区已经用
strlen是函数。sizeof是操作符。。下面一个简单的程序说明这件事: #include <iostream> #inc
还是在大学时代接触的C语言,当时学习数组、指针等概念时,怎一个“晕”字了得。最近在学习之余,疯
首先,声明一下这是一个系列的文章。至于整个系列有多少篇,笔者也不知道,不知道有多少篇,也不知
函数声明:extern unsigned int strlen(char *s); 所属函数库:<string.h> 功能:返回s所指的
说到C语言,就不得不说它的继承者——C++语言。众所周知,C++语言是在C语言的基础上,添加了面向对
说到C语言,就不得不说它的继承者——C++语言。众所周知,C++语言是在C语言的基础上,添加了面向对
说到C语言,就不得不说它的继承者——C++语言。众所周知,C++语言是在C语言的基础上,添加了面向对
说到C语言,就不得不说它的继承者——C++语言。众所周知,C++语言是在C语言的基础上,添加了面向对
一.代码移动 将在循环里面多次计算,但是结果不会改变的计算,移到循环外面去。 例子: 优化前: vo
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号