首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C二维数组的小疑点

2013-08-10 
C二维数组的小问题void Sort(char a[6][6])int main(){char s[6][6]char *pp&s[6][6]int i0,jfor(i

C二维数组的小问题
void Sort(char a[6][6]);
int main()
{
char s[6][6];
    char *p;
     p=&s[6][6];
int i=0,j;
for(i=0;i<6;i++)
{
scanf("%s",s[i]);
}
Sort(s);
for(i=0;i<6;i++)
printf("%s\n",s[i]);
return 0;
}
void Sort(char a[6][6])
{
    char temp;
for(int k=0;k<6;k++)
for(int i=0;a[k][i]!='\0';i++)
{
for(int j=i+1;a[k][j]!='\0';j++)
{
if(a[k][i]>a[k][j])
{
temp=a[k][i];
a[k][i]=a[k][j];
a[k][j]=temp;
}
}
}
}
为什么输入少于6位字符的时候输出就正常,6位时就不正常了呢?哪里出了问题?
[解决办法]
字符串以'\0'结尾
[解决办法]
没错,字符串以'\0'结尾,输入6个字符时已经超出范围了。
[解决办法]
你要是输入六个呢,没有结束符了,估计发生了越界错误!
[解决办法]
字符串以0结尾,使用scanf输入字符串按enter键后输入的字符就会放到指定位置,并且自动加上一个'\0'结尾。比如scanf("%s",s[0]);加入"flying"则s[0][0]到s[0][5]这六个位置放置flying而'\0'被放置到下一个位置就是s[1][0].下次执行scanf("%s",s[1]);时s[1][0]位置的'\0'被覆盖。。Sort函数中使用a[k][i]!='\0'就有问题了,只有k=5,i=6时才能结束判断
[解决办法]
如果直接在代码里给二维数组添加数据那么char b[5]  当然可以放入5个数据,但是你是用的scanf读入数据的,回车给你带了个 /0  ,当然最后多了个数据咯,这样就越界出错了。
[解决办法]



注意数组越界问题,字符串'\0'的隐形存在

一般情况下这些操作都会比实际多分配一部分字节出来的,

就是为了防止数组越界,导致内存出错了的

[解决办法]
引用:

Quote: 引用:


如果直接在代码里给二维数组添加数据那么char b[5]  当然可以放入5个数据,但是你是用的scanf读入数据的,回车给你带了个 /0  ,当然最后多了个数据咯,这样就越界出错了。

可是这样就可以输出啊!
C二维数组的小疑点
结果:
sdggd
sdggd
 为什么%c就可以 ?


对字符数组赋值,像这样一个一个赋值话,程序不会自动在后面加'\0',以字符串形式输出会出现乱码,如果以字符串形式输入,scanf("%s",a)程序就会自动在后面加终止符
[解决办法]
没有结束符的控制。
[解决办法]
字符串要有结束符
[解决办法]
你这个程序传参的方式好奇怪.
总感觉不对,我没去编译试试.
也说不上哪里不对..
[解决办法]
1)p=&s[6][6];
别开玩笑好不好;
2)void Sort(char a[6][6])
等价于 void Sort(char a[][6])
和 void Sort(char (*a)[6])
参数是数组指针,每个数组最多6个字符

二维数组名,恰好就可以,看成一维数组的指针。
所以参数传递没有问题,有问题的是,只能是6个字符的一维数组的指针,多一个字符不成,少一个也完不成。
至于错误问题,数据超过6个字符,因为你的数据越界,所以6个字符中可能没有,结束符,或者a[0]的结束符
在a[1]中,超过36个字符时,问题就很大了,不再位于局部变量中了。
要想输入长数据,把6改成80,可以输入80-1个字符,差不多够了。
char a[6][6];
 改成
char a[6][80];

char s[6][6];
改成
char s[6][80];

[解决办法]
字符串以'\0'结尾
[解决办法]

printf("%s\n",s[i]);

格式控制符%s/%S,只能正确处理以'\0'结束的字符串

热点排行