参考:
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. 跟自己刚学的指针没冲突,又进了一步。
谢谢观赏!!!