被指针弄糊涂的菜鸟

legendwd 2004-03-22 10:58:25
输入三个字符串 比较大小 从小到大顺序输出
我的程序得出的结果惨不忍堵 请熟手指点
#include <stdio.h>
swap(int *p1,int *p2)
{ int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
exchange(int *m,int *n,int *s,int *a,int *b,int *c)
{ if(*m>*n)
swap(m,n);
swap(a,b);
if(*m>*s)
swap(m,s);
swap(a,c);
if(*n>*s)
swap(n,s);
swap(b,c);
}

main()
{ int a[100],b[100],c[100],*p_a,*p_b,*p_c;
int *sum1,*sum2,*sum3,sum_1,sum_2,sum_3;
sum1=&sum_1,sum2=&sum_2,sum3=&sum_3;/*三个指针分别指向三个统计的变量*/
sum_1=0,sum_2=0,sum_3=0;
p_a=a,p_b=b,p_c=c;
printf("input the first string:");
while((*p_a=getchar())!='\n');
{ sum_1=sum_1+*p_a;
p_a++;
}
printf("input the second string:");
while((*p_b=getchar())!='\n')
{
sum_2=sum_2+*p_b;
p_b++;
}
printf("input the third string:");
while((*p_c=getchar())!='\n')
{
sum_3=sum_3+*p_c;
p_c++;
}
p_a=a,p_b=b,p_c=c; /*让指针重新指向三个字符串的首位*/
exchange(sum1,sum2,sum3,p_a,p_b,p_c);
printf("the largetst string: %d %s\n",sum1,a);
printf("the middle string: %d %s\n",sum2,b);
printf("the smallest string: %d %s\n",sum3,c);
}



...全文
48 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
womanlee 2004-03-22
  • 打赏
  • 举报
回复
楼上在干什么??
swap函数没有问题,传的是指针啊!!!

据说(没试过),c里面的字符实际上
就是比较小的整型
languagec 2004-03-22
  • 打赏
  • 举报
回复
swap(int * &p1,int * &p2)
{
int *temp;
temp=p1;
p1=p2;
p2=temp;
}

应该是这样 !
晕,反应太慢了
g11448498 2004-03-22
  • 打赏
  • 举报
回复
你的定义也有点问题吧```既然是字符数组,怎么可以用int定义呢。。。。(不解*_*!)
g11448498 2004-03-22
  • 打赏
  • 举报
回复
temp=*p1;
*p1=*p2;
*p2=temp;
这样并没有错,而且也可以改变实参的直。
g11448498 2004-03-22
  • 打赏
  • 举报
回复
你不是在比较3个字符串的大小,`比较字符串的大小是比较第一个字符的大小。你的是在比较每个字符串和的大小吧`
cai114 2004-03-22
  • 打赏
  • 举报
回复
*&操作是相反的
这不是C++,&不能做引用
languagec 2004-03-22
  • 打赏
  • 举报
回复
temp=*p1;
*p1=*p2;
*p2=temp;
这样还是错的 被弄湖了

temp=p1;
p1=p2;
p2=temp;
languagec 2004-03-22
  • 打赏
  • 举报
回复
可能回错了 容我在想想 一片混乱啊……
againli 2004-03-22
  • 打赏
  • 举报
回复
楼上在干什么?
languagec 2004-03-22
  • 打赏
  • 举报
回复
swap(int *p1,int *p2) 并不能真正交换两个指针的值.
如果你是在VC 6.0下编的应该将
swap(int *p1,int *p2)
{ int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
改为
swap(int * &p1,int * &p2)//可能是 & *p1 , 记不清了
{
int *temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}

wangnewton 2004-03-22
  • 打赏
  • 举报
回复
楼主的函数模块都没有错,第二个exchange部分是不是掉了大括弧
而且既然是字符串比较大小,就应该把a[100],b[100],c[100]定义成字符型
这样可以避免printf("string: %s\n",c);出现错误的情况
看了你的程序,感觉其实不是指针的错,或者说没什么大错,这里用到的指针,
都是很基本的用法,刚刚将你的程序略加修改了一下,大致实现了你所想要的功能:


#include <stdio.h>
iswap(int *p1,int *p2)
{ int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
cswap(char *p1,char *p2)
{ char temp;
temp=*p1;
*p1=*p2;
*p2=temp;
} //抱歉:c里面没有多态,呵呵

exchange(int *m,int *n,int *s,char *a,char *b,char *c)
{ if(*m>*n)
{
iswap(m,n);
cswap(a,b);
}
if(*m>*s){
iswap(m,s);
cswap(a,c);
}
if(*n>*s){
iswap(n,s);
cswap(b,c);
}
}

main()
{ char a[100]="",b[100]="",c[100]="",*p_a,*p_b,*p_c;
int *sum1,*sum2,*sum3,sum_1,sum_2,sum_3;
sum1=&sum_1,sum2=&sum_2,sum3=&sum_3;
sum_1=0,sum_2=0,sum_3=0;
p_a=a,p_b=b,p_c=c;

printf("input the first string:");
while((*p_a=getchar())!='\n')
{ sum_1=sum_1+*p_a;
p_a++;
}
printf("input the second string:");
while((*p_b=getchar())!='\n')
{
sum_2=sum_2+*p_b;
p_b++;
}
printf("input the third string:");
while((*p_c=getchar())!='\n')
{
sum_3=sum_3+*p_c;
p_c++;
}
p_a=a,p_b=b,p_c=c;
//printf("sum1=%d",*sum1);
//printf("a=%s\n",a);
exchange(sum1,sum2,sum3,p_a,p_b,p_c);
printf("\nthe largetst string: %d %s\n",*sum3,c);
printf("the middle string: %d %s\n",*sum2,b);
printf("the smallest string: %d %s\n",*sum1,a);
}
womanlee 2004-03-22
  • 打赏
  • 举报
回复
楼主的意思不是很明白,不过定义成整型指针,然后相加,得出的是整数,砍楼主的意思是要显示字符串,那要 char *a;这样来声明
========== 1.易支持库机制 ========== !!!易支持库的库信息、命令信息等等均使用某个结构储存 !!!易源码中的自定义数据类型、类模块、组件即为支持库中的库定义数据类型 !!!易语言通过 GetNewInf() 获取支持库信息 !!!所以支持库必须导出这个函数 ========== 2.支持库命令调用 ========== !!!支持库的命令调用方式也比较特殊 !!!每个命令需要三个参数:返回值指针,参数数目,参数信息指针 !!!做个一个库定义数据类型的方法,每个方法的第一个参数为指向该对象的结构指针 ========== 3.简单说下易源码 ========== !!!易保存源码时没有保存各信息名称(比如命令名、数据类型名),而是保存了索引 !!!所以支持库内的各信息有必要时可以修改 !!!但不要改动TA们的顺序,这会导致前期版本的源码出现问题 ========== 4.模版说明 ========== !!!本模版整天来说思路清晰,代码连小白都能理解 !!!模版多数的参数使用通用型,使得模版简便 !!!模版内没有多说废话, 直接把关键的过了一遍, 足够写支持库了 !!!每条命令都演示了支持库的各种操作,能想到的都先写了 !!!暂时没写组件,目前没什么时间了,玩着电脑也冷~ !!!尽量抽时间将组件的开发也模块化 !!!或者各位有心人士可参考 e\sdk\cpp\samples\HtmlView 写一下 ========== 5.关于静态库 ========== !!!本人目前只做了动态库,不做静态库原因很多 !!!本来打算做静态库的,不过考虑到某些原因: !!!静态库误报,动态库转到静态库时也会出现一些未知问题 !!!个人也建议使用独立编译,5.3已经恢复 !!!更建议用 黑月Cool编译 !!!或者直接就是一个“懒”字! !!!各路有心人士可动手改一下 !!!我也好了静态连接名的录入机制 ========== 6.为何选择支持库 ========== !!!其实用模块扩展程序也是足够了 !!!选择做支持库还是安全的 !!!而且支持库有许多模块做不到的功能 ========== 7.关于易功能函数 ========== !!!顾名思义, 就是易内部提供给支持库的函数 !!!主要的用法呢还是得参考 lib2.h(位于 e\sdk\cpp\elib\lib.h) !!!虽说是一个C++头文件,但是语文好点、懂易语言就能理解 !!!小学生的语文水平就差不多啦 !!!我还是把一些常用的写到了 类_易功能 这个类里面 !!!各位同学可以看看、、 ========== 【最后】 ========== !!!直说:本人纯属菜鸟一枚, 各路大神勿喷即可 ==========  【信息】  ========== !!!模版:易支持库模版 !!!作者:SalHe(Rabbit Group) !!!声明:大鸟勿喷即可 !!!日期:2014年11月8日
========== 1.易支持库机制 ========== !!!易支持库的库信息、命令信息等等均使用某个结构储存!!!易源码中的自定义数据类型、类模块、组件即为支持库中的库定义数据类型!!!易语言 通过 GetNewInf() 获取支持库信息!!!所以支持库必须导出这个函数 ========== 2.支持库命令调用 ========== !!!支持库的命令调用方式也比较特殊!!!每个命令需要三个参数:返回值指针,参数数目,参数信息指针!!!做个一个库定义数据类型的方法,每个方法的第一个参数为指向该对象的结构指针 ========== 3.简单说下易源码 ========== !!!易保存源码时没有保存各信息名称(比如命令名、数据类型名),而是保存了索引!!!所以支持库内的各信息有必要时可以修改!!!但不要改动TA们的顺序,这会导致前期版本的源码出现问题 ========== 4.模版说明 ========== !!!本模版整天来说思路清晰,代码连小白都能理解!!!模版多数的参数使用通用型,使得模版简便!!!模版内没有多说废话, 直接把关键的过了一遍, 足够写支持库了!!!每条命令都演示了支持库的各种操作,能想到的都先写了!!!暂时没写组件,目前没什么时间了,玩着电脑也冷~!!!尽量抽时间将组件的开发也模块化!!!或者各位有心人士可参考 e\sdk\cpp\samples\HtmlView 写一下 ========== 5.关于静态库 ========== !!!本人目前只做了动态库,不做静态库原因很多!!!本来打算做静态库的,不过考虑到某些原因:!!!静态库误报,动态库转到静态库时也会出现一些未知问题!!!个人也建议使用独立编译,5.3已经恢复!!!更建议用 黑月Cool编译!!!或者直接就是一个“懒”字!!!!各路有心人士可动手改一下!!!我也好了静态连接名的录入机制 ========== 6.为何选择支持库 ========== !!!其实用模块扩展程序也是足够了!!!选择做支持库还是安全的!!!而且支持库有许多模块做不到的功能 ========== 7.关于易功能函数 ========== !!!顾名思义, 就是易内部提供给支持库的函数!!!主要的用法呢还是得参考 lib2.h(位于 e\sdk\cpp\elib\lib.h)!!!虽说是一个C++头文件,但是语文好点、懂易语言就能理解!!!小学生的语文水平就差不多啦!!!我还是把一些常用的写到了 类_易功能 这个类里面!!!各位同学可以看看、 、 ========== 【最后】 ========== !!!直说:本人纯属菜鸟一枚, 各路大神勿喷即可 ==========??【信息】??========== !!!模版:易支持库模版!!!作者:SalHe(Rabbit Group)!!!声明:大鸟勿喷即可!!!日期:2014年11月8日怎么编译我还是简单说一下,针对一下小白。编译的时候将文件名的后缀改为fne在放入易语言的支持库目录就好了支持库一发布后就不要修改数字签名和支持库文件名了
!!!当前版本:2014.11.15 !!!更新内容: !!! [+]支持编写静态库(至于步骤请往下看) !!! [+]增加静态库转换工具, 在随本模版的压缩包内(源码) !!! [+]增加 类_写易库.设置_静态库模式() 方法, 用于指定静态库的导出函数名 !!! [-]对 类_写易库.添加命令() 做了改动,主要修改链接名 !!! [-]修复 易语言 无法读取链接名的BUG ========== 1.易支持库机制 ========== !!!易支持库的库信息、命令信息等等均使用某个结构储存 !!!易源码中的自定义数据类型、类模块、组件即为支持库中的库定义数据类型 !!!易语言通过 GetNewInf() 获取支持库信息 !!!所以支持库必须导出这个函数 ========== 2.支持库命令调用 ========== !!!支持库的命令调用方式也比较特殊 !!!每个命令需要三个参数:返回值指针,参数数目,参数信息指针 !!!做个一个库定义数据类型的方法,每个方法的第一个参数为指向该对象的结构指针 ========== 3.简单说下易源码 ========== !!!易保存源码时没有保存各信息名称(比如命令名、数据类型名),而是保存了索引 !!!所以支持库内的各信息有必要时可以修改 !!!但不要改动TA们的顺序,这会导致前期版本的源码出现问题 ========== 4.模版说明 ========== !!!本模版整天来说思路清晰,代码连小白都能理解 !!!模版多数的参数使用通用型,使得模版简便 !!!模版内没有多说废话, 直接把关键的过了一遍, 足够写支持库了 !!!每条命令都演示了支持库的各种操作,能想到的都先写了 !!!暂时没写组件,目前没什么时间了,玩着电脑也冷~ !!!尽量抽时间将组件的开发也模块化 !!!或者各位有心人士可参考 e\sdk\cpp\samples\HtmlView 写一下 ========== 5.关于静态库 ========== !!!静态库的编译本人提供了两种方式,不过两种方式都必须要符合下面的要求 !!!必须导出(易语言里打上公开属性)库信息通知函数, 函数名必须符合 libName_ProcessNotifyLib 的规则 !!!必须导出所有命令实现函数,函数名必须符合 libName_xxx 的规则 !!!必须导出所有窗口单元信息函数,函数名必须符合 libName_GetInterface_控件英文名。2014.11.13这个版本的模版包括前面的暂时木有组件,所以不会有这个函数 !!! !!!第一种方法(#静态库模式_SalHe) !!!将支持库编译 !!!此时还不能做为静态库发布 !!!使用本人写的工具 FNE转LIB 将编译后的支持库转换 !!!转换之后的文件即可作为静态库发布了 !!!工具的使用方法详见工具的自我介绍 !!! !!!第二种方法(#静态库模式_WonderWall) !!!下载一个易语言支持库(插件):WonderWall !!!易语言勾上这个支持库之后并开启静态库编译功能(易语言菜单 -> 工具 -> WonderWall) !!!易语言菜单 -> 编译 -> 静态库编译 !!!此时再拖入工具中加工(进行符号重命名) !!! !!!至于我写的那个工具也放得有源码, 所以要知道原理的话可以看看源码 !!! !!!那么WonderWall编译静态库为什么要另外个模式呢?请转到 类_写易库.添加命令() 查看, 看的更清楚 ========== 6.为何选择支持库 ========== !!!其实用模块扩展程序也是足够了 !!!选择做支持库还是安全的 !!!而且支持库有许多模块做不到的功能 ========== 7.关于易功能函数 ========== !!!顾名思义, 就是易内部提供给支持库的函数 !!!主要的用法呢还是得参考 lib2.h(位于 e\sdk\cpp\elib\lib.h) !!!虽说是一个C++头文件,但是语文好点、懂易语言就能理解 !!!小学生的语文水平就差不多啦 !!!我还是把一些常用的写到了 类_易功能 这个类里面 !!!各位同学可以看看、、 ========== 【最后】 ========== !!!直说:本人纯属菜鸟一枚, 各路大神勿喷即可 ==========【信息】========== !!!模版:易支持库模版 !!!作者:SalHe(Rabbit Group) !!!声明:大鸟勿喷即可 !!!日期:2014年11月15日 !!!论坛: !!! 精易论坛 : http://bbs.125.la/uid-186545 !!! 易语言官方论坛:http://bbs.eyuyan.com/u.php?uid=6

70,037

社区成员

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

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