为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
PIPIONE 2023-03-19 21:17:28
#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);}
查看完整描述

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; 
}

 


查看完整回答
反对 回复 2023-03-22
?
紫衣仙女

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

}

 


查看完整回答
反对 回复 2023-03-22
  • 2 回答
  • 0 关注
  • 73 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信