• 指针数组学习中的小插曲真是醉了Strcmp用法


    参考

        1.C++ 从入门到精通第三版;

        2.https://blog.csdn.net/liaoshengshi/article/details/45099923      如是多次被别人转载的地址并未侵权想法,没时间去找到底谁写的。

    铺垫:   

        1. 在自学的过程中感觉一本好书真的可以节约很多时间,不幸的是...。。只怪当时随便买了一本还不是vs的编译环境。。。。

        2. 最近几天本来被指针,数组,指针的指针,指针数组搞得把自己学懵了,好不容感觉有了(希望自己有时间和闲心好好总结一番发到自己微博上),准备大开s戒的时候,就被一串代码卡住了,真是心态崩了。。。。

        3. 这个问题可能也只有我这种初学者有,如果下面这段代码的调试结果你完全没有疑问请大神跳过就好!不过还是想记录自己的学习过程。

    代码: 

     1 #include <iostream>
     2 using namespace std;
     3 void sort(char *name[],int n)                  // 字符串排序
     4 { 
     5     char *temp;
     6     int i,j,k;
     7     for(i=0;i<n-1;i++)
     8     {
     9         k=i;
    10         for(j=i+1;j<n;j++)
    11 //下面是自己想验证strcmp()后的结果
    12         {
    13             cout<< strcmp(name[k],name[j]) << endl;
    14             if(strcmp(name[k],name[j])>0) { k=j; cout << "I am more than zero "<< endl; }
    15         
    16         cout << "name[K]="<<  name[k]<<" "<<"K="<< k<< " "<<"Kaddress:" << name + k  << endl;
    17         }
    18         if(k!=i)
    19         { 
    20             temp=name[i];name[i]=name[k];name[k]=temp;
    21         }
    22     }
    23 }
    24 void print(char *name[],int n)                  //输出字符串元素
    25 { 
    26     int i=0;
    27     char *p;
    28     p=name[0];
    29     while(i<n)  
    30     {
    31         p=*(name+i++);
    32         cout<<p<<endl;
    33     }
    34 }
    35 int main( )
    36 { 
    37     char *name[]={"mingri","soft","C++","mr"};      //定义指针数组
    38     int n=4;
    39 
    40     int m =0;
    41 
    42     for (m; m< 4; m++)
    43 //输出起始地址
    44     {
    45     cout << "first address:" << name + m<< endl;
    46     }
    47 
    48     sort(name,n);
    49     print(name,n);
    50     return 0;
    51 }
    52 
    53 /* 
    54 结果如下
    55 
    56 first address:001AFE60
    57 first address:001AFE64
    58 first address:001AFE68
    59 first address:001AFE6C
    60 -1
    61 name[K]=mingri K=0 Kaddress:001AFE60
    62 1
    63 I am more than zero
    64 name[K]=C++ K=2 Kaddress:001AFE68
    65 -1
    66 name[K]=C++ K=2 Kaddress:001AFE68
    67 1
    68 I am more than zero
    69 name[K]=mingri K=2 Kaddress:001AFE68
    70 -1
    71 name[K]=mingri K=2 Kaddress:001AFE68
    72 1
    73 I am more than zero
    74 name[K]=mr K=3 Kaddress:001AFE6C
    75 C++
    76 mingri
    77 mr
    78 soft
    79 Press any key to continue . . .
    80 
    81 
    82 */


    就是对这结果不满意:

                C++
                mingri
                mr
                soft

    但对自己刚学的指针知识自认没毛病,如是开启了一大批验证代码尝试,有的在家电脑,一起都是这个结果没毛病啊!

    (现在想想可能是自己学了matlab原因C++又不精吧,一直认为strcmp是比较字符串长度的,虽然知道这和matlab返回值是有区别的,也仅知道这些而已)

    最后我认为一定是自己对strcmp()函数认识不够造成的;

    最终找到一篇令自己豁然开朗的解释:

               strcmp函数是C/C++中基本的函数,它对两个字符串进行比较,然后返回比较结果,函数形式如下: int strcmp(const char* str1, const char* str2); 其中str1和str2可以是字符串常量或者字符串变量,返回值为整形。返回结果如下规定: ① str1小于str2,返回负值或者-1(VC返回-1);                    

    ② str1等于str2,返回0; ③ str1大于str2,返回正值或者1(VC返回1);

    strcmp函数实际上是对字符的ASCII码进行比较,实现原理如下:首先比较两个串的第一个字符,若不相等,则停止比较并得出两个ASCII码大小比较的结果;如果相等就接着 比较第二个字符然后第三个字符等等。无论两个字符串是什么样,strcmp函数最多比较到其中一个字符串遇到结束符'/0'为止,就能得出结果。strcmp算法的可以有多种,不过我觉的可以把这么多算法分为两种,一种是利用减法运算判断结果,另一种是利用比较运算(==)得出结果。

    分析:

      这段代码所谓的排序是ASCII码排序:C=67 ,m=109, o=111, r=114, s=115

    就是这么简单;结果和我的想法达到了一直,认识了这个概念

     

    这里写这么多两点欣喜:

                1. 解决了问题不论问题大小,说明还要多学啊,学海无涯。

                2. 跟自己刚学的指针没冲突,又进了一步。    

     

    谢谢观赏!!!       

       

  • 相关阅读:
    数据仓库专题18-数据建模语言IDEF(转载)
    数据仓库专题(14)-数据仓库建设指导原则:一切以就绪数据为主
    数据仓库专题(16)-分布式数据仓库实践指南-目录篇
    解释器模式
    命令模式
    责任链模式
    代理模式
    享元模式
    外观模式
    装饰器模式
  • 原文地址:https://www.cnblogs.com/MCSFX/p/10268993.html
Copyright © 2020-2023  润新知