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

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

}

PIPIONE
浏览 104回答 2
2回答

不负相思意

#include<stdio.h>&nbsp;#include<string.h>&nbsp;void Swap(char *p1,char *p2); //一般函数的申明放在全局区较好,确保函数在程序周期内都能使用&nbsp;void compositor(char (*p)[20],int n);&nbsp;void main()&nbsp;{&nbsp;char str[3][20];&nbsp;int i;&nbsp;printf("please input ten same length strings\n");&nbsp;for(i=0;i<3;i++)&nbsp;{scanf("%s",&str[i]);}&nbsp;compositor(str,3);//!!!!!这一行的 警告让我恼火不已警告 noname.c 15: 指针转换后指向其它类型在 main 函数中!!!!/&nbsp;printf("After sorting by small to large\n");&nbsp;for(i=0;i<3;i++)&nbsp;{printf("%s\n",str[i]);}&nbsp;//getch();&nbsp;}&nbsp;void compositor(char (*p)[20],int n) //你的有点繁琐,而且有错误,已改正&nbsp;{ int i,j;&nbsp;for(i=0;i<n-1;i++)&nbsp;{&nbsp;for(j=i+1;j<n;j++)&nbsp;if (strcmp(p[i],p[j])>0)&nbsp;Swap(p[i],p[j]);&nbsp;}&nbsp;}&nbsp;void Swap(char *p1,char *p2)&nbsp;{&nbsp;char p[20];&nbsp;strcpy(p,p1);&nbsp;strcpy(p1,p2);&nbsp;strcpy(p2,p);&nbsp;}当然,如果你用C++的话,则问题就变得非常简单#include<iostream>&nbsp;#include<algorithm>&nbsp;#include<vector>&nbsp;#include<string>&nbsp;using namespace std;&nbsp;int main()&nbsp;{&nbsp;vector<string> name;&nbsp;string s;for(int i=0;i<10;i++){cin>>s;name.push_back(s);}sort(name.begin(),name.end());&nbsp;cout<<"排序后:"<<endl;&nbsp;for(vector<string>::size_type i=0;i<name.size();i++)&nbsp;cout<<name[i]<<endl;&nbsp;return 0;&nbsp;}&nbsp;

紫衣仙女

凑合一下吧&nbsp;#include <stdio.h>&nbsp;#include <string.h>&nbsp;#include <malloc.h>&nbsp;void SortStringArray( char **, int );&nbsp;int main()&nbsp;{&nbsp;int nN , nMaxlength, i;&nbsp;char **pString, strFormat[13] = {0};&nbsp;puts("Input N :( N strings ) ");&nbsp;if( 1 != scanf("%d", &nN) )&nbsp;return 1;&nbsp;puts("Input Max-length:");&nbsp;if( 1 != scanf("%d", &nMaxlength) )&nbsp;return 2;&nbsp;fflush( stdin );&nbsp;pString = (char**)malloc( nN * sizeof(char*) );&nbsp;strFormat[0] = '%';&nbsp;sprintf( strFormat + 1 , "%d", nMaxlength);&nbsp;strFormat[ strlen(strFormat) ] = 's';&nbsp;for( i=0; i<nN; i++ )&nbsp;{&nbsp;printf("Input String %d :\n", i);&nbsp;pString[ i ] = (char*)malloc( ( nMaxlength + 1 ) * sizeof(char) );&nbsp;scanf( strFormat, pString[i] );&nbsp;fflush( stdin );&nbsp;}&nbsp;SortStringArray( pString, nN );&nbsp;puts("\nResult:\n");&nbsp;for( i=0; i<nN ; i++ )&nbsp;{&nbsp;puts( pString[i] );&nbsp;free( pString[i] );&nbsp;}&nbsp;free( pString );&nbsp;return 0;&nbsp;}&nbsp;int CompareString( const char*, const char* );&nbsp;void SortStringArray( char **pString, int nN )&nbsp;{&nbsp;int i, j, nMaxPos;&nbsp;char *pTemp;&nbsp;for( i=0; i<nN - 1 ; i++)&nbsp;{&nbsp;nMaxPos = 0;&nbsp;for( j=1; j<nN - i -1; j++ )&nbsp;if( CompareString( pString[j] , pString[nMaxPos] ) >= 0 )&nbsp;nMaxPos = j;&nbsp;if( CompareString( pString[nMaxPos], pString[ nN - i - 1 ] ) >= 0 )&nbsp;{&nbsp;pTemp = pString[nMaxPos];&nbsp;pString[nMaxPos] = pString[ nN - i - 1 ];&nbsp;pString[ nN - i - 1 ] = pTemp;&nbsp;}&nbsp;}&nbsp;}&nbsp;int CompareString( const char *str1, const char *str2 )&nbsp;{&nbsp;if( !str1 || !str2)&nbsp;{&nbsp;if( str1 == str2 )&nbsp;return 0;&nbsp;else&nbsp;return str1 - str2;&nbsp;}&nbsp;do{&nbsp;if( ! *str1 || ! *str2 )&nbsp;return *str1 - *str2;&nbsp;}while( *str1++ == *str2++ );&nbsp;return *--str1 - *--str2;&nbsp;}&nbsp;顺便比了下自己写的和strcmp比速度...居然只有它的1/5..汗,不愧是汇编函数另外,改好了&nbsp;其实也没啥错&nbsp;#include<stdio.h>&nbsp;#include<string.h>&nbsp;void main()&nbsp;{&nbsp;void Swap(char *p1,char *p2);&nbsp;void compositor(char (*p)[20],int n); //20&nbsp;char str[3][20];&nbsp;int i;&nbsp;printf("please input ten same length strings\n");&nbsp;for(i=0;i<3;i++)&nbsp;{scanf("%s",*(str+i));}&nbsp;compositor(str,3);&nbsp;printf("After sorting by small to large\n");&nbsp;for(i=0;i<3;i++)&nbsp;{printf("%s\n",*(str+i));}&nbsp;getch();&nbsp;}&nbsp;void compositor(char (*p)[20],int n) //声明成20&nbsp;{ int i,j,k;&nbsp;for(i=0;i<n-1;i++)&nbsp;{&nbsp;k=i;&nbsp;for(j=i+1;j<n;j++)&nbsp;if (strcmp(*(p+j),*(p+k))<0) k=j; // 选最小的&nbsp;if(k!=i)&nbsp;Swap(*(p+i),*(p+k)); // 把i错写成j了&nbsp;}&nbsp;}&nbsp;void Swap(char *p1,char *p2)&nbsp;{&nbsp;char p[20];&nbsp;strcpy(p,p1);&nbsp;strcpy(p1,p2);&nbsp;strcpy(p2,p);&nbsp;}&nbsp;
打开App,查看更多内容
随时随地看视频慕课网APP