C二维数组的小问题

穆林幕 2013-08-03 10:10:34
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位时就不正常了呢?哪里出了问题?
...全文
343 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
穆林幕 2013-08-09
  • 打赏
  • 举报
回复
谢谢各位大神!
一根烂笔头 2013-08-05
  • 打赏
  • 举报
回复

printf("%s\n",s[i]);
格式控制符%s/%S,只能正确处理以'\0'结束的字符串
pengfangxu8 2013-08-05
  • 打赏
  • 举报
回复
字符串以'\0'结尾
lm_whales 2013-08-05
  • 打赏
  • 举报
回复
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];
穆林幕 2013-08-04
  • 打赏
  • 举报
回复
引用 8 楼 luohao1213 的回复:
如果直接在代码里给二维数组添加数据那么char b[5] 当然可以放入5个数据,但是你是用的scanf读入数据的,回车给你带了个 /0 ,当然最后多了个数据咯,这样就越界出错了。

可是这样就可以输出啊!

结果:
sdggd
sdggd
为什么%c就可以 ?
max_min_ 2013-08-04
  • 打赏
  • 举报
回复


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

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

就是为了防止数组越界,导致内存出错了的
水平不流 2013-08-04
  • 打赏
  • 举报
回复
你这个程序传参的方式好奇怪. 总感觉不对,我没去编译试试. 也说不上哪里不对..
yanasdf789 2013-08-04
  • 打赏
  • 举报
回复
字符串要有结束符
benny-lee 2013-08-04
  • 打赏
  • 举报
回复
没有结束符的控制。
u010574425 2013-08-04
  • 打赏
  • 举报
回复
引用 10 楼 u010582475 的回复:
[quote=引用 8 楼 luohao1213 的回复:] 如果直接在代码里给二维数组添加数据那么char b[5] 当然可以放入5个数据,但是你是用的scanf读入数据的,回车给你带了个 /0 ,当然最后多了个数据咯,这样就越界出错了。
可是这样就可以输出啊! 结果: sdggd sdggd 为什么%c就可以 ?[/quote] 对字符数组赋值,像这样一个一个赋值话,程序不会自动在后面加'\0',以字符串形式输出会出现乱码,如果以字符串形式输入,scanf("%s",a)程序就会自动在后面加终止符
一根烂笔头 2013-08-03
  • 打赏
  • 举报
回复
你要是输入六个呢,没有结束符了,估计发生了越界错误!
秋千坠丶 2013-08-03
  • 打赏
  • 举报
回复
如果直接在代码里给二维数组添加数据那么char b[5] 当然可以放入5个数据,但是你是用的scanf读入数据的,回车给你带了个 /0 ,当然最后多了个数据咯,这样就越界出错了。
yangweiping2011 2013-08-03
  • 打赏
  • 举报
回复
没错,字符串以'\0'结尾,输入6个字符时已经超出范围了。
LubinLew 2013-08-03
  • 打赏
  • 举报
回复
字符串以'\0'结尾
穆林幕 2013-08-03
  • 打赏
  • 举报
回复
引用 1 楼 lgbxyz 的回复:
\n
有什么问题吗?为什么输入2个字符的时候都可以换行?
LubinLew 2013-08-03
  • 打赏
  • 举报
回复
\n
zhctj159 2013-08-03
  • 打赏
  • 举报
回复
字符串以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时才能结束判断
穆林幕 2013-08-03
  • 打赏
  • 举报
回复
引用 3 楼 lgbxyz 的回复:
字符串以'\0'结尾
可是数组比如b[5]就可以存放5个字符不包括‘\0’的啊,b[5]和s[k][6]不是一样的吗,那为什么s数组就只能放5个字符?和%s有关系吗?

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧