三种方式(二维数组,指针数组,数组指针)输入10个字符串,进行排序,输出

本文详细介绍了使用C语言实现字符串排序的三种方法:二维数组、数组指针和指针数组,每种方法都附带了详细的代码示例,旨在帮助读者理解不同数据结构在字符串排序中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


方式一 二维数组


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

/*

  • 输入10个字符串,进行排序,输出

* 利用字符型二维数组

*/

#define N 10

// 选择排序
void sort(char p[][20])
{

 int i = 0, k, j = 0;
char temp[20];

for(i = 0; i < N-1; i++)
{
	k = i;
	for(j = i+1; j < N; j++)
		if(strcmp(p[k], p[j]) > 0)
			k = j;	
	if( k != i)
	{
		/* *****
		 * 超级错误,字符串之间不能直接赋值,要用字符串函数 
		temp = p[i];
		p[i] = p[k];
		p[k] = temp;	
		 * *****
		*/
		strcpy(temp, p[i]);
		strcpy(p[i], p[k]);
		strcpy(p[k], temp); 
	}
}	

}

//冒泡排序
void sort_1(char p[][20])
{

int i, j;
//char *temp; // 这样错误,因为导致了野指针问题 
char temp[20];

for(i = 1; i < N; i++)
	for(j = 0; j < N-i; j++)
	{
		if(strcmp(p[j], p[j+1]) > 0)
		{
			strcpy(temp, p[j]);
			strcpy(p[j], p[j+1]);
			strcpy(p[j+1], temp);	
		}	
	
	}	

}

void main()
{

	char str[N][20];
	int i = 0;
	
	puts("input 10 strings:");
	
	for(i = 0; i < N; i++)
		gets(str[i]);
	
	sort_1(str);
	
	puts("\nsorted string: \n");
	for(i = 0; i < N; i++)
		puts(str[i]);

}


方式二: 数组指针


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

#define N 10

/*

  • 输入10个字符串,进行排序,输出

* 用指向一维数组的指针 (数组指针)

*/

void sort(char (*p)[20]) // 数组大小需要指明
{

int i,j;
char temp[20];

for(i = 1; i < N; i++)
	for(j = 0; j < N; j++)
	{
		if(strcmp(p[j], p[j+1]) > 0)
		{
			strcpy(temp, p[j]);
			strcpy(p[j], p[j+1]);
			strcpy(p[j+1], temp);	
		}	
	}

}

void print(char (*p)[20]) // 参数调用时,数组大小需要指明
{

int i = 0;
for(i = 0; i < N; i++)
	printf("%s\n",*(p+i));  // *(p+i) 代表了所指向的数组的首地址 

}

void main()
{

char str[N][20];
char (*p)[20];
int i = 0;

p = str; //p 指向了数组

for(i = 0; i < N; i++)
	scanf("%s",str[i]);

printf("original: \n")
print(p);
	
sort(p);

printf("\nsorted: \n")
print(p); 

}



方式三: 指针数组


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

#define N 10

/*

  • 输入10个字符串,进行排序,输出

* 用指针数组

*/

void print(char *p[10])
{

// printf("%d\n", sizeof(p)); // 大小: 4 相当于一个 二重指针,所以大小为4

int i = 0;

for(i = 0; i < N; i++)
	printf("%s\n", p[i]);	

}

void sort(char *p[]) // 数组大小可以不指明
{

int i,j;
char temp[20];

for(i = 1; i < N; i++)
{
	for(j = 0; j < N-i; j++)
		if(strcmp(p[j], p[j+1]) > 0)
		{
			strcpy(temp, p[j]);
			strcpy(p[j], p[j+1]);
			strcpy(p[j+1], temp);	
		}	
}

}

void main()
{

char *p[N], str[N][20];
int i = 0;

 // printf("%d\n",sizeof(p));  // 40
 
/*
 *  指针数组  如果不是在初始化时赋值,那么必须将指针指向具体的内存后再进行赋值 
for(i = 0; i < N; i++)
	scanf("%s", p[i]);
*/

/*
 *将指针数组中存放的指针进行初始化,不然就是野指针
 *
*/ 
for(i = 0; i < N; i++)
	 p[i] = str[i];  
	 
printf("input strings:\n");	
for(i = 0; i < N; i++)
	scanf("%s", str[i]);
	
sort(p); //排序 

printf("\nsorted:\n");
print(p);

}


小结:

1. 数组指针(指针指向了一定大小的数组),作为函数形参时,指针指向的数组大小需要指明
2. 指针数组(数组中存放的是指针元素),使用时需要进行初始化赋值,或者需要指向具体的内存单元后,才能作为函数实参进行调用
比如:
1. char *p[5] = {“sadas”, “ds”, “vfd”, “wfs”, NULL}; // 初始化赋值
2. for(i = 0; i < 5;i++)
p[i] = str[i] // str 作为数组,已经分配了具体的内存单元,所以让指针数组中的指针指向具体的内存
3. 指针数组 作为函数形参时,数组大小可以不指定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值