字符串

14号选手 2012-12-06 10:39:22
这样的一段代码
字符串排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M 100
int main(int argc,char *argv[])
{
char s[3][5];
int i,j,k;
char *temp;
char *p[3];
for(i=0;i<3;i++)
{
fgets(s[i],M,stdin);
//gets(s[i]);
p[i]=s[i];
}
for(i=0;i<2;i++)
{
k=i;
for(j=i+1;j<3;j++)
{
if(strcmp(p[k],p[j])>0)
k=j;
if(k!=i)
{
temp=p[i];
p[i]=p[k];
p[k]=temp;
}
}
}
printf("\n");
for(i=0;i<3;i++)
puts(p[i]);
//fputs(p[i],stdout);
return 0;
}


如果使用gets输入则是正确输出的
为什么使用fgets输入,而是这样的

我debug的时候,看到用fgets输入的,它的指针不是单独的指向一行,而是如果该行不是最后一行,则会把后面的行给连接起来
如下


我只是用了一个指针数组来指向每一行的首地址
为什么fgets和gets会有这样的情况呢?
...全文
435 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
额。。好吧。。解决了,比较字符串时妥妥的。。收工,睡觉。。
14号选手 2012-12-07
  • 打赏
  • 举报
回复
引用 37 楼 vermouth19861012 的回复:
额。。字符串应该是可以的。。全数字不太行。。
全数字我就不会用字符数组来装数据了啊 直接用int数组不就ok了
14号选手 2012-12-07
  • 打赏
  • 举报
回复
引用 34 楼 vermouth19861012 的回复:
引用 31 楼 breakfisher 的回复:引用 29 楼 breakfisher 的回复:引用 27 楼 xuchao1229 的回复:引用 26 楼 vermouth19861012 的回复:好吧,我理解错了。。,而且我的IDE还抽了。。 呵呵 没事,在这里本来就是互相学习的 你用的是什么IDE? 排序是有点问题 C/C++ code?123456789……
也就好比你输入国家的名字来比较是一样的 国家的名字有长有短,位数肯定是不相同的 比如china和america就不同,但是排序之后就是america在前面
  • 打赏
  • 举报
回复
额。。字符串应该是可以的。。全数字不太行。。
  • 打赏
  • 举报
回复
额。。你这个好像还是有些问题,strcmp在比较位数不同的数字时,会出我上面说的那个问题。。你再看看吧。。呵呵
14号选手 2012-12-07
  • 打赏
  • 举报
回复
引用 34 楼 vermouth19861012 的回复:
引用 31 楼 breakfisher 的回复:引用 29 楼 breakfisher 的回复:引用 27 楼 xuchao1229 的回复:引用 26 楼 vermouth19861012 的回复:好吧,我理解错了。。,而且我的IDE还抽了。。 呵呵 没事,在这里本来就是互相学习的 你用的是什么IDE? 排序是有点问题 C/C++ code?123456789……
字符串是用首字母排序啊,首字母相同则会继续往后面比较
  • 打赏
  • 举报
回复
引用 31 楼 breakfisher 的回复:
引用 29 楼 breakfisher 的回复:引用 27 楼 xuchao1229 的回复:引用 26 楼 vermouth19861012 的回复:好吧,我理解错了。。,而且我的IDE还抽了。。 呵呵 没事,在这里本来就是互相学习的 你用的是什么IDE? 排序是有点问题 C/C++ code?123456789101112131415for(i=0;i<2;……
额。。这个还有点问题,就是如果数字位数是一样的,就是对的,但是如果位数不一样就不对了,比如20,5,8,只比较了2和5,所以20还排在了最前面。。
14号选手 2012-12-07
  • 打赏
  • 举报
回复
引用 28 楼 vermouth19861012 的回复:
额。。怎么还是抽着在,我用的visual studio 2010啊。。我重启了哈。。为什么还是得不到正确的结果呢。。我还是用的 9630 7410 8520
那应该是你IDE的问题了
14号选手 2012-12-07
  • 打赏
  • 举报
回复
引用 29 楼 breakfisher 的回复:
引用 27 楼 xuchao1229 的回复:引用 26 楼 vermouth19861012 的回复:好吧,我理解错了。。,而且我的IDE还抽了。。 呵呵 没事,在这里本来就是互相学习的 你用的是什么IDE? 排序是有点问题 C/C++ code?123456789101112131415for(i=0;i<2;i++) { k=i; ……
我这个排序有问题??? 应该没有吧
breakfisher 2012-12-06
  • 打赏
  • 举报
回复
引用 29 楼 breakfisher 的回复:
引用 27 楼 xuchao1229 的回复:引用 26 楼 vermouth19861012 的回复:好吧,我理解错了。。,而且我的IDE还抽了。。 呵呵 没事,在这里本来就是互相学习的 你用的是什么IDE? 排序是有点问题 C/C++ code?123456789101112131415for(i=0;i<2;i++) { k=i; ……
发现copy错代码了
for(i=0;i<2;i++)
  {
    for(j=i+1;j<3;j++)
    {
      if(strcmp(p[i],p[j])>0) {
        temp=p[i];
        p[i]=p[j];
        p[j]=temp;
      }
    }
  }
  • 打赏
  • 举报
回复
引用 29 楼 breakfisher 的回复:
引用 27 楼 xuchao1229 的回复:引用 26 楼 vermouth19861012 的回复:好吧,我理解错了。。,而且我的IDE还抽了。。 呵呵 没事,在这里本来就是互相学习的 你用的是什么IDE? 排序是有点问题 C/C++ code?123456789101112131415for(i=0;i<2;i++) { k=i; ……
额。。
breakfisher 2012-12-06
  • 打赏
  • 举报
回复
引用 27 楼 xuchao1229 的回复:
引用 26 楼 vermouth19861012 的回复:好吧,我理解错了。。,而且我的IDE还抽了。。 呵呵 没事,在这里本来就是互相学习的 你用的是什么IDE?
排序是有点问题
for(i=0;i<2;i++)
    {
        k=i;
        for(j=i+1;j<3;j++)
        {
            if(strcmp(p[k],p[j])>0)
                k=j;
            if(k!=i)
            {
                temp=p[i];
                p[i]=p[k];
                p[k]=temp;
            }
        }
    }
换这个吧
  • 打赏
  • 举报
回复
额。。怎么还是抽着在,我用的visual studio 2010啊。。我重启了哈。。为什么还是得不到正确的结果呢。。我还是用的 9630 7410 8520
14号选手 2012-12-06
  • 打赏
  • 举报
回复
引用 26 楼 vermouth19861012 的回复:
好吧,我理解错了。。,而且我的IDE还抽了。。
呵呵 没事,在这里本来就是互相学习的 你用的是什么IDE?
  • 打赏
  • 举报
回复
好吧,我理解错了。。,而且我的IDE还抽了。。
14号选手 2012-12-06
  • 打赏
  • 举报
回复
引用 22 楼 vermouth19861012 的回复:
好吧。。我IDE出问题了好像

你加了*没有报错吗?
可是我的报错了啊
14号选手 2012-12-06
  • 打赏
  • 举报
回复
引用 23 楼 vermouth19861012 的回复:
晕。。好像没有出问题啊。。
是啊 程序当然是没有问题 只是字符串的宽度没掌控好,呵呵 今天对fgets这个函数加深了了解
  • 打赏
  • 举报
回复
晕。。好像没有出问题啊。。
  • 打赏
  • 举报
回复
好吧。。我IDE出问题了好像
14号选手 2012-12-06
  • 打赏
  • 举报
回复
引用 19 楼 vermouth19861012 的回复:
我觉得是有问题,而且我测试出来也是没有排序的,我刚看你的程序看了半天,你要是测出来有问题,我觉得问题就在 char *p[3];和(strcmp(p[k],p[j]) 你申明的是一个指针数组,数组里面的是3个指针,所以比较的p[k]和p[j]其实是比较的地址,而你那一组数据的地址刚好是升序的,所以就结果就是反过来打印的,只有*(p[k])才能取到值
难道这个比较函数里面会房完整的字符串进去??? 不就是放一个地址(地址不就是指向字符串)进去吗??? 难道要加一个*符号吗????那样会报错。。。。。。。。。。。。。。。
加载更多回复(20)

69,371

社区成员

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

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