2 回答
TA贡献1777条经验 获得超10个赞
#include<stdio.h>
#include<string.h>
void Swap(char *p1,char *p2); //一般函数的申明放在全局区较好,确保函数在程序周期内都能使用
void compositor(char (*p)[20],int n);
void main()
{
char str[3][20];
int i;
printf("please input ten same length strings\n");
for(i=0;i<3;i++)
{scanf("%s",&str[i]);}
compositor(str,3);//!!!!!这一行的 警告让我恼火不已警告 noname.c 15: 指针转换后指向其它类型在 main 函数中!!!!/
printf("After sorting by small to large\n");
for(i=0;i<3;i++)
{printf("%s\n",str[i]);}
//getch();
}
void compositor(char (*p)[20],int n) //你的有点繁琐,而且有错误,已改正
{ int i,j;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
if (strcmp(p[i],p[j])>0)
Swap(p[i],p[j]);
}
}
void Swap(char *p1,char *p2)
{
char p[20];
strcpy(p,p1);
strcpy(p1,p2);
strcpy(p2,p);
}
当然,如果你用C++的话,则问题就变得非常简单
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
int main()
{
vector<string> name;
string s;
for(int i=0;i<10;i++)
{
cin>>s;
name.push_back(s);
}
sort(name.begin(),name.end());
cout<<"排序后:"<<endl;
for(vector<string>::size_type i=0;i<name.size();i++)
cout<<name[i]<<endl;
return 0;
}
TA贡献1839条经验 获得超15个赞
凑合一下吧
#include <stdio.h>
#include <string.h>
#include <malloc.h>
void SortStringArray( char **, int );
int main()
{
int nN , nMaxlength, i;
char **pString, strFormat[13] = {0};
puts("Input N :( N strings ) ");
if( 1 != scanf("%d", &nN) )
return 1;
puts("Input Max-length:");
if( 1 != scanf("%d", &nMaxlength) )
return 2;
fflush( stdin );
pString = (char**)malloc( nN * sizeof(char*) );
strFormat[0] = '%';
sprintf( strFormat + 1 , "%d", nMaxlength);
strFormat[ strlen(strFormat) ] = 's';
for( i=0; i<nN; i++ )
{
printf("Input String %d :\n", i);
pString[ i ] = (char*)malloc( ( nMaxlength + 1 ) * sizeof(char) );
scanf( strFormat, pString[i] );
fflush( stdin );
}
SortStringArray( pString, nN );
puts("\nResult:\n");
for( i=0; i<nN ; i++ )
{
puts( pString[i] );
free( pString[i] );
}
free( pString );
return 0;
}
int CompareString( const char*, const char* );
void SortStringArray( char **pString, int nN )
{
int i, j, nMaxPos;
char *pTemp;
for( i=0; i<nN - 1 ; i++)
{
nMaxPos = 0;
for( j=1; j<nN - i -1; j++ )
if( CompareString( pString[j] , pString[nMaxPos] ) >= 0 )
nMaxPos = j;
if( CompareString( pString[nMaxPos], pString[ nN - i - 1 ] ) >= 0 )
{
pTemp = pString[nMaxPos];
pString[nMaxPos] = pString[ nN - i - 1 ];
pString[ nN - i - 1 ] = pTemp;
}
}
}
int CompareString( const char *str1, const char *str2 )
{
if( !str1 || !str2)
{
if( str1 == str2 )
return 0;
else
return str1 - str2;
}
do
{
if( ! *str1 || ! *str2 )
return *str1 - *str2;
}while( *str1++ == *str2++ );
return *--str1 - *--str2;
}
顺便比了下自己写的和strcmp比速度...居然只有它的1/5..汗,不愧是汇编函数
另外,改好了
其实也没啥错
#include<stdio.h>
#include<string.h>
void main()
{
void Swap(char *p1,char *p2);
void compositor(char (*p)[20],int n); //20
char str[3][20];
int i;
printf("please input ten same length strings\n");
for(i=0;i<3;i++)
{scanf("%s",*(str+i));}
compositor(str,3);
printf("After sorting by small to large\n");
for(i=0;i<3;i++)
{printf("%s\n",*(str+i));}
getch();
}
void compositor(char (*p)[20],int n) //声明成20
{ int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if (strcmp(*(p+j),*(p+k))<0) k=j; // 选最小的
if(k!=i)
Swap(*(p+i),*(p+k)); // 把i错写成j了
}
}
void Swap(char *p1,char *p2)
{
char p[20];
strcpy(p,p1);
strcpy(p1,p2);
strcpy(p2,p);
}
- 2 回答
- 0 关注
- 103 浏览
添加回答
举报