鱼C论坛

 找回密码
 立即注册
查看: 4761|回复: 10

C语言字符串比较

[复制链接]
发表于 2012-12-27 12:31:02 | 显示全部楼层 |阅读模式
5鱼币
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main()
  5. {
  6.     void compare (char *p,char *q);
  7.     char *name[]={"Fishc.com","www.fishc.com","home.fishc.com","fuck you!","thank you!"};

  8.     int i,j;

  9.     for(i=0;i<5;i++)
  10.     {
  11.         printf("%s\n",name[i]);
  12.     }

  13.     for (i=0;i<4;i++)
  14.     {
  15.         for(j=i+1;j<5;j++)
  16.         {
  17.             compare(name[i],name[j]);
  18.         }
  19.     }
  20.     printf("\n");
  21.     for(i=0;i<5;i++)
  22.     {
  23.         printf("%s\n",name[i]);
  24.     }
  25.     printf("\n");


  26.     return 0;
  27. }

  28. void compare(char *p,char *q)
  29. {
  30.     char *p1;
  31.     int flag;
  32.     flag=strcmp(p,q);
  33.     if(flag>0)
  34.     {
  35.         p1=p;
  36.         p=q;
  37.         q=p1;
  38.     }
  39. }
复制代码
这段代码为什么不能进行字符串比较呢?还望大侠们指导

最佳答案

查看完整内容

他的形参是char *p[] 你可以看做传递过来的是指针数组 那数组传过来是不是 就把数组地址传过来了啊 那也就是说 他是指针的指针 然后他把指向char类型的指针地址交换 注意他传过来是二级指针 也就是说 一级指针在外界 没有入到这个函数的栈里面 不会随着函数的消失而消失 所以修改是有效的
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-12-27 12:31:03 | 显示全部楼层

他的形参是char *p[] 你可以看做传递过来的是指针数组 那数组传过来是不是 就把数组地址传过来了啊 那也就是说 他是指针的指针 然后他把指向char类型的指针地址交换 注意他传过来是二级指针 也就是说 一级指针在外界 没有入到这个函数的栈里面 不会随着函数的消失而消失 所以修改是有效的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-27 12:54:17 | 显示全部楼层
他比较是正确的 字符串对调不对 你这个只是对调指针值 而传过来的指针是形参 不会对外界造成任何影响 字符串赋值建议用 strcpy或 memcpy
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-27 13:02:16 | 显示全部楼层
堕落づ天使 发表于 2012-12-27 12:54
他比较是正确的 字符串对调不对 你这个只是对调指针值 而传过来的指针是形参 不会对外界造成任何影响 字符串 ...

就是按照你的逻辑应该这样
strcpy(p1,p);
strcpy(p,q);
strcpy(q,p1);
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-27 13:21:45 | 显示全部楼层
堕落づ天使 发表于 2012-12-27 13:02
就是按照你的逻辑应该这样
strcpy(p1,p);
strcpy(p,q);
  1. void compare(char *p[])
  2. {

  3.     int i,j,flag;
  4.     char *p1=NULL;
  5.     for (i=0;i<4;i++)
  6.     {
  7.         for (j=i+1;j<5;j++)
  8.         {

  9.             if ((flag=strcmp(p[i],p[j]))>0)
  10.             {
  11.                 p1=p[i];
  12.                 p[i]=p[j];
  13.                 p[j]=p1;
  14.             }
  15.         }
  16.     }
  17. }
复制代码
那这种方法为什么可行呢?p[i][i]存放的不也是地址吗[/i]
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-27 17:32:37 | 显示全部楼层
第一楼提供的代码典型的就是值传递,是不能交换值的,4楼的代码是双指针,当然可以交换值了,建议楼主看看指针这块。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-28 15:55:46 | 显示全部楼层
我要好好学习 天天向上 我是零基础 彻彻底底的零基础 我小学文化 数学还不是太好 英语根本就不会 就知道ABCDEFGHIGKLMN什么的 你说我能学会吗 也没有人跟我交流:Q
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-28 19:41:37 | 显示全部楼层
白露为霜 发表于 2012-12-28 15:55
我要好好学习 天天向上 我是零基础 彻彻底底的零基础 我小学文化 数学还不是太好 英语根本就不会 就知道ABC ...

努力就能学会。不会就上论坛问或者百度,肯定没问题的,要相信自己啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-28 19:44:31 | 显示全部楼层
堕落づ天使 发表于 2012-12-27 13:02
就是按照你的逻辑应该这样
strcpy(p1,p);
strcpy(p,q);

为什么我像你这么修改了屏幕上都不显示了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-30 14:26:59 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    void compare (char *p,char *q);
    char name[][100]={"Fishc.com","www.fishc.com","home.fishc.com","fuck you!","thank you!"};

    int i,j;

    for(i=0;i<5;i++)
    {
        printf("%s\n",name[i]);
    }

    for (i=0;i<4;i++)
    {
        for(j=i+1;j<5;j++)
        {
            compare(name[i],name[j]);
        }
    }
    printf("\n");
    for(i=0;i<5;i++)
    {
        printf("%s\n",name[i]);
    }
    printf("\n");


    return 0;
}

void compare(char *p,char *q)
{
    char t[100];
    int flag;
    flag=strcmp(p,q);
    if(flag>0)
    {
                strcpy(t,p);
                printf("%s\n",t);
                strcpy(p,q);
                strcpy(q,t);
    }
}
不好意思 前天昨天一直在赶项目
你的程序申明有问题呢 对比吓我的程序吧 你这个明显指针非法访问了 如果超过4K还会出现段错误 (linux下)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-30 16:05:05 | 显示全部楼层
堕落づ天使 发表于 2012-12-30 14:26
#include
#include
#include

嗯,再次感谢您的回答
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-13 00:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表