神奇的字符串

94 篇文章 0 订阅
90 篇文章 1 订阅
1、小错误
#include<iostream>
using namespace std;
int main()
{
	char a[20]="hello";
}

是正确的。

#include<iostream>
using namespace std;
int main()
{
	char a[20];
	a[20]="hello";
}
确实是错误的。以上的a[20]就等价于调用数组a的第21个元素,故该语句的意思就是,想把字符串“hello”存在一个字符单位a[20]里,很显然是错误的,第一,无a[20];第二,“hello”字符串长度为6,根本不能存在一个长度单位里面。


2、数组的字母代表首地址,定义一个数组之后,该首地址就已经固定了。

Class fun
{
private:
  char pa[20];
public:
  fun(char *p)
  {
    pa=p;
  }
}
这个类很显然出现了一些问题,因为该类的构造方法试图去改变数组的首地址,很显然是不可能的。

3、使用字符指针和字符数组存储字符串的形式完全不一样

#include<iostream>
using namespace std;
int main()
{
	char a[200]="hello";
	char *p="dsfsdfsdfsds";
	int m=sizeof(a);
	int n=sizeof(p);
	cout<<m<<endl<<n<<endl;
	cout<<a<<endl<<p<<endl;
}
200
4
hello
dsfsdfsdfsds

可见字符指针和字符数组所占的空间是不一样的,数组大小与数组元素个数有关,指针所占内存大小与内存的地址空间有关,此编译器结果为4,说明占了32位,也就是说该编译器认为本机的内存为2^32B,即4G。

sizeof求得是该变量所占的内存的大小,而strlen求的是改变量的长度,要想求出字符指针所指字符串的长度,可以用strlen,遇到字符串中的‘\0’才结束。对于字符数组,其对应的strlen和sizeof的大小是相等的。


但对于asII码的sizeof("IT学吧");和strlen("IT学吧");,显然前者是7(即所占的内存),后者是6(即长度,遇‘\0’结束)。但对于Unicode码的sizeof("IT学吧");和wcslen("IT学吧");前者为10(每个字符均占两个字节),后者是4(两个字节为一个长度,遇到"\0\0"结束)


4、数组名作为函数参数进行传递,传递的是地址,因此必会改变数组的值。具体可参见http://blog.csdn.net/lz465350/article/details/19161537

5、要想使用string s;定义一个string对象,就必须使用#include<string>,而不能用#include<cstring>。cstring中没有string类,只有strcpy、strcmp等函数。如果用cin输入字符串,最好用string s;可以直接cin>>s;。cin的输入默认是以空格为结束符的,如果想让输入的内容中包含空格,则只需用getline(cin,s)代替cin>>s即可。

而对于char *pchar;这个字符指针变量的输入,可以使用scanf("%s",pchar);参考http://blog.sina.com.cn/s/blog_76e067cf0101771f.html


6、又如:我们编写好的程序,最好在两种字符集的操作系统下都能够兼容。
那如何做到两种字符集都兼容呢?要做如下定义:

#ifdef _UNICODE
	#define _tcslen wcslen
	#define TCHAR   wchar_t
	#define LPTSTR  wchar_t*
	#define _T(x)	L##x

#else
	#define _tcslen strlen
	#define TCHAR	char
	#define LPTSTR	char*
	#define _T(x)	x
#endif
可以兼容Unicode和ASII码。又如:
TCHAR p[]=TEXT("IT学吧");
//在多字节字符集下
int l1=sizeof(p);
int l2=_tcslen(p);
//在宽字节字符集下
int l3=sizeof(p);
int l4=_tcslen(p);
l1是7,l2是6,l3是10,l4是 4

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值