C语言 sizeof和strlen之间的那些事 C/C++软件开发求职面试题 必备考点(一)
找工作在即,以后决定每天至少写一个知识点,主要是记录,逼迫自己动手、总结加深印象。当然如果能有一言半语让他人收益,后学幸运之至也。如有错误,还希望大家帮忙指出来。感激不尽。
后学保证每个写出来的结果都是自己在电脑上亲自跑过的,咱人笨,以前学的也半吊子。很多时候只能靠运行出来的结果再反过来总结,再结合书上讲的,才能融为自己的。环境为:Fedora14 GCC / g++编译器 32位
第一课,就来搞sizeof和strlen吧。
sizeof是一个单目操作符,而不是函数。作用是计算其操作数的存储空间。操作数可以是一个表达式或者一个类型。如sizeof(int)。而strlen是一个函数,只能用char *做参数,且必须是以'\0'结尾的,计算有效字符串的字符数。
示例:
#include <stdio.h>
voidmain()
{
charstr[]="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>
usingnamespacestd;
voidupgrade(charstr[])
{
for(inti=0;i<strlen(str);i++)
if('a'<=str[i]&&str[i]<='z')
//str[i]=str[i]+('A'-'a');
str[i]+='A'-'a';
}
intmain()
{
charstr[]="HellEveryOne";
cout<<str<<endl;
upgrade(str);
cout<<str<<endl;
return0;
}
linux下,c++程序后缀名可以不改为.cpp,用.c, 但一定要用g++来编译,而且要想用strlen必须加#include <string.h>.
[root@localhost learn]# g++ test.cpp -o out
[root@localhostlearn]#./out
HellEveryOne
HELLEVERYONE