关于字符串 按长度排序字符串【分快用完了】
就是让输入10个字符串,然后做一个菜单对数据进行处理,我做到第三个功能的时候卡住了 求解答 谢谢
主要是【Slen】这个函数出错了 望指点
#include <stdio.h>
#include <ctype.h>
#include <string.h>
void show (char **p,int n)
{
int i ;
for(i=0;i<n;i++)
fputs(p[i],stdout);
}
void cmp (char **p,int n)
{
int i,j;
char t[1][81];
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
if (strcmp(p[i],p[j])>0)
{
*(t[0]) = *(p[i]);
*(p[i]) = *(p[j]);
*(p[j]) = *(t[0]);
}
}
show(p,n);
}
void Slen (char **p,int n)
{
int i,j;
int i,j;
char t[1][81];
i=0;
j=i+1;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
if (strlen(p[i])<strlen(p[j]))
{
*(t[0]) = *(p[i]);
*(p[i]) = *(p[j]);
*(p[j]) = *(t[0]);
}
}
show(p,n);
}
int main(void)
{
char ar[10][81];
char * p[10];
char com[10];
int i;
//输入模块
while(1)
{
i=0;
puts("输入字符串");
while(fgets(ar[i],80,stdin)!=NULL)
{
p[i] = ar[i];
i++;
}
puts("选择:");
puts("a:显示字符串;b:按照ascii顺序排列字符串");
puts("c:按长度d:");
puts("e:重新输入");
puts("请做选择:");
fgets(com,10,stdin);
switch(com[0])
{
case 'a':
show (p,i);
break;
case 'b':
cmp (p,i);
break;
case 'c':
Slen (p,i);
break;
}}}
/*
case 'd':
case 'e':
}
}
}
*/
[解决办法]
根本原因在于,你像很多初学者一样,把char*指针当成了字符串
char*指针可以用于指向内存中字符串的首地址,它本身只是一个指针
*(t[0]) = *(p[i]);
在这行语句中,你的*解引用操作,操作的只是t[0]和p[i]这两个char*指针指向的char型数据,只是那一个字节而已
我知道你想操作的是t[1][81]这个二维数组中的数据,但姑且不论你没能达到你的目的,你的目的实际上犯了另一个错误:c/c++不支持数组的整体赋值,只有在初始化的时候才能一个语句改变整个数组
所以顶楼的代码是错误的
p[i] = p[j]
这行语句将指针p[i]的值改变为指针p[j]的值,此时两个指针指向的东西理所当然是相同的,因为它们指向同一个东西,原本p[i]的值被保存在t里面
理所当然,这些指针指向的东西没有任何变化,只是这些指针的指向被改变了
所以2楼的想法是错误的
c语言中没有“字符串”这种数据类型,任何对字符串的操作都需要调用字符串处理函数,本质上是对一串连续的字符进行操作
所以字符串不能用=操作符进行赋值,因为c语言本质上根本就不认识字符串这种东西,你只能调用函数来处理“一连串以0结尾的连续字符”
[解决办法]
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
提醒:
“学习用汇编语言写程序”
和
“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?