方式一 二维数组
#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);
}