在主函数输入10个等长的字符串。用另一函数对它们排序。然后在主函数输出这10个已经排好序的字符串

C程序 指针 这个题目用指针数组我会,但是用另一种方法我写的代码有逻辑问题,且运行答案不正确 代码如下

#include<stdio.h>
#include<string.h>

void Swap(char *p1,char *p2);
void compositor(char *p,int n);
void main()
{

char *p, str[10][20];
int i;
p=str[0];
printf("please input ten same length strings\n");
for(i=0;i<10;i++)
{scanf("%s",p+i);}/我想用一个指针指向字符串数组,可无论怎么试
p=str[0]; /可无论怎么试都不成功
compositor(p,10); /我的疑惑是怎样才能用指针指向字符串数组的
printf("After sorting by small to large\n");/每一个字符串
p=str[0]; /并对这些字符串操作排序
for(i=0;i<10;i++)
{printf("%s\n",p+i);}
getch();

}
void compositor(char *p,int n) /选择排序法/
{ int i,j,k,t;
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+j,p+k); /我的指针用法肯定出问题了,
/但不知道要怎么改
}

}

void Swap(char *p1,char *p2)

{

char p[20];

strcpy(p,p1);

strcpy(p1,p2);

strcpy(p2,p);

}
/所以 总的要求是, 能否不用指针数组做这个题,指针数组我会/
/能的话, 帮我改程序,,不能 的说明理由,理由详细点/

这是我后面 自己调试时改的代码。仍然很有问题 ,指针对字符串是操作不到的。答上面的问题就可得全部的分,不过你心情好可以帮我 解决第15行 警告 那个警告到底是什么意思
#include<stdio.h>
#include<string.h>

void main()
{
void Swap(char *p1,char *p2);
void compositor(char (*p)[3],int n);
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)[3],int n)
{ 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+j),*(p+k));

}

}

void Swap(char *p1,char *p2)

{

char p[20];

strcpy(p,p1);

strcpy(p1,p2);

strcpy(p2,p);

}

凑合一下吧

#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);

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-12-11
#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;
}
第2个回答  2008-12-11
看了半天。。看不懂我学的是PASCAL。。。晕
第3个回答  2008-12-11
my god

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网