算法:C语⾔实现(3)字符串数组的排序
/*
注解: 在处理字符串时,  我们通常使⽤⼀个指向包含那个字符串的缓冲区的指针,
如上图, 应为指针要⽐长度⼤⼩可变的字符串⾃⾝更容易操纵
输⼊完后:  对于这个程序理解,
1. ⾸先定义了⼀个⽤于存储字符串数组的缓冲区字符串
2. a是个字符串指针类型的数组
3. a[N]表⽰了含有N个字符串的指针
如果这个⽂件后缀名写为cpp, 那么编译的时候会出错,  因为CPP 和C的函数的压栈顺序不⼀样, 所以
qsort( particles, n, sizeof( particle ), &cmp );这⼀⾏⼀直没能编译通过,报的错误是error C2664: “qsort” :
不能将参数 4 从“int (const FILEINFO *,const FILEINFO *)”转换为“int (__cdecl *)(const void *,const void *)”
还好能从⽹上到答案,按照下⾯的格式定义cmp就可以在C++中运⾏了:int __cdecl cmp(const void* p1, const void* p2 ),
还有说法是将cmp定义成static类型也是可以
__cdecl 是C DECLaration的缩写(declaration,声明),表⽰C语⾔默认的函数调⽤⽅法:所有参数从右到左依次⼊栈,这些参数由调⽤者清除,称为⼿动清栈。
_stdcall 是StandardCall的缩写,是C++的标准调⽤⽅式:所有参数从右到左依次⼊栈,如果是调⽤类成员的话,最后⼀个⼊栈的是this指针。这些堆栈中的参数由被调⽤的函数在返回后清除,使⽤的指令是 retnX,X表⽰参数占⽤的字节数,CPU在ret之后⾃动弹出X个字节的堆栈空间。
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define  Nmax 1000
#define  Mmax 10000
char buf[Mmax];
int M = 0;
int compare(void *i, void *j)
{
return strcmp(*(char **)i, *(char **)j);
}
int main ()
{
int i,N;
char* a[Nmax];
for (N = 0; N < Nmax; N++)
{
a[N] = &buf[M]; //将a[N]赋值为""(空的字符串), buf 是⼀个容量⾜够⼤的字符串容器
if (scanf("%s",a[N])== EOF)//这样的输⼊以后, 会默认在字符数组后⾯加上'\0'字符
break;
M += strlen(a[N])+1;//M统计了中的字符串数组中字符的个数, ⽽N表⽰了buf中具有的字符串的个数
}
qsort(a, N, sizeof(char *), compare);
for (i=0; i < N; i++)
{c语言如何创建字符串数组
printf("%s\n",a[i]);
}
return0 ;
}
这个程序的运⾏结果
注解: 在处理字符串时,  我们通常使⽤⼀个指向包含那个字符串的缓冲区的指针,  如上图, 应为指针要⽐长度⼤⼩可变的字符串⾃⾝更容易操纵

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。