c/c++有关字符串处理的小程序

来源:百度知道 编辑:UC知道 时间:2024/06/07 18:53:03
此程序目的是将AAAAA变为5个22222
然处理结果很是奇怪!
#include<iostream>
#include<cstdlib>
using namespace std;
char cimapp(char a)
{
if(a=='A'||a=='B'||a=='C')
return '2';
if(a=='D'||a=='E'||a=='F')
return '3';
if(a=='G'||a=='H'||a=='I')
return '4';
if(a=='J'||a=='K'||a=='L')
return '5';
if(a=='M'||a=='N'||a=='O')
return '6';
if(a=='P'||a=='R'||a=='S')
return '7';
if(a=='T'||a=='U'||a=='V')
return '8';
else
return '9';
}
void main()
{
char a[5];
char b[5];
for(int i=0;i<5;i++)
a[i]='A';
for(int j=0;j<strlen(a);j++)
b[j]=cimapp(a[i]);
a[5]='\0';

看起来a[5]='\0'; 一句是你后来加上去的。因为加上去以后输出第二行结果为5.
至于之前为什么为11.你应该发现了。实际上不存在a[5]这个单元。c++只是向后延续访问了一下。a数组没有没有一个'\0'作为结尾,c++只好按照自己的规则计算字符串长度。
具体规则我不清楚。

先看b的结果。当你给a数组赋值以后,i的值为5,不是4. 将c++访问到的a[5]单元的值(是随机值)带入到那个处理函数中,return '9'.当然就全是9了.

再来看a数组。根据c++的变量分配原则,b数组在a数组之前分配,a数组紧跟在b数组后面。而变量内存单元分配是以4字节的整数倍来分配的。你定义一个b、char类型,虽然看起来只用了一个字节,但是接下来的3个字节系统是不允许再分配给别的单元了。定义char num[5],看起来只有5个单元,但只接下来的3个字节也不允许再分配了,因为4<5<8。结合这些规则。我们可以画出a和b的内存分配图了。
a的首地址在从b的首地址开始向后的第八个位置。

下面进入cimapp循环,循环变量j的上限是10,记住。也就是做了11次。在b首字节开始,连续访问11个字节,你能看到,最后3个字节已经进入了a数组的领域了。就像b数组全是9一样,a的那3个字节也变成9了。

基本就是这个原理了。可能我没讲清楚,请指教!

哎。。。。我表述能力有限啊。。。。请谅解。。。

c++内存单元分配是以4个字节为一个整体。一个char类型的变量是一个字节,但是紧跟着的3个字节的空间是不允许再分配给其他的变量的。
如果你定义了char a[5],那表面上c++分配了5个字节,但其实是用掉了8个字节。后面多出来的3个不允许再分配给其他的变量了。
b在a的前面。下面我描述一下内存分配图吧。一个O表示一个字节的单元:
| OOOO,OOOO | OOOO,OOOO |
b 0123 4567 a 0123 4567 序号为567的字节只表示顺序,数组其实不包含。