下面主函数调用函数SortString()
按奥运会参赛国国名在字典中的顺序对其入场次序进行排序,目前程序存在错误,请修改正确,并按照给出的程序运行示例检查修改后的程序。
#include <stdio.h>
#include <string.h>
#define M 150 /* 最多的字符串个数 */
#define N 10 /* 字符串最大长度 */
void SortString(char *ptr[], int n);
int main()
{
int i, n;
char *pStr[M];
printf("How many countries?\n");
scanf("%d",&n);
getchar(); /* 读走输入缓冲区中的回车符 */
printf("Input their names:\n");
for (i=0; i<n; i++)
{
gets(pStr[i]); /* 输入n个字符串 */
}
SortString(pStr, n); /* 字符串按字典顺序排序 */
printf("Sorted results:\n");
for (i=0; i<n; i++)
{
puts(pStr[i]); /* 输出排序后的n个字符串 */
}
return 0;
}
void SortString(char *ptr[], int n)
{
int i, j;
char *temp = NULL;
for (i=0; i<n-1; i++)
{
for (j=i+1; j<n; j++)
{
if (strcmp(ptr[j], ptr[i]) < 0)
{
temp = ptr[i];
ptr[i] = ptr[j];
ptr[j] = temp;
}
}
}
}
程序运行结果示例:
How many countries?
5
Input their names:
China
French
America
Russia
German
Sorted results:
America
China
French
German
Russia
输入国家数量提示信息:“How many countries?\n”
输入国家名字提示信息:“Input their names:\n”
输入格式:
输入国家数量:"%d"
字符串输入:使用gets()函数;
输出提示信息:“Sorted results:\n”
**输出格式:**使用puts()函数
解析
首先,题目中的错误其实就出现在对字符指针赋值那一处,首先明确gets(str)
函数是输入一个字符串并赋值给str
,但是我们的指针是属于字符类型的,直接赋值会出现类型转换异常(个人猜测),所以我们应该要先用一个字符数组来接收这一个字符串,再用这个指针指向这个数组。
那么问题来了,指向数组,和指向字符串,有什么区别呢?
首先我们要先区分一下直接char *str = "abcd";
和先char *str;
再str = "abcd";
的区别。
前者相当于创建了一个名为str
的字符数组,这是对字符数组的初始化,是c语言所支持的格式;而后者则是先新建了一个char
类型的字符型指针,再妄图把一个字符串塞给(赋值)这个指针,那自然是会报错。而我们知道,其实将一个指针指向一个数组,其实相当于指向这个数组的首个元素的地址,而并不是指向整一个数组,在输出字符串时,程序会自动的识别你这个类型单个元素所占的空间,然后将整一个数组的字符全部输出。而如果要指向整一个数组,我们应该使用数组指针。
由上两图可以看到,指针所占的内存等于char类型所占内存,所以指针指向的其实是数组的第一号元素
那么回到题目,我们想要利用指针来完成需求,即排序,则需要新建一个数组,来存放我们的国家名,由于有多个国家名,所以我们需要的其实是一个二维数组,每一行代表一个国家名*(即一个字符串)*。然后我们令题目给出的指针数组对应地指向这一个二维数组的每一行,问题就解决了。
#include <stdio.h>
#include <string.h>
#define M 150 /* 最多的字符串个数 */
#define N 10 /* 字符串最大长度 */
void SortString(char* ptr[], int n);
int main()
{
int i, n;
// 我们所需要的二维数组
char str[M][N];
char* pStr[M];
printf("How many countries?\n");
scanf_s("%d", &n);
getchar(); /* 读走输入缓冲区中的回车符 */
printf("Input their names:\n");
for (i = 0; i < n; i++)
{
// 将国家名存放到二维数组中去
gets(str[i]); /* 输入n个字符串 */
}
for (int i = 0; i < n; i++)
{
// 指针指向二维数组
pStr[i] = str[i];
}
SortString(pStr, n); /* 字符串按字典顺序排序 */
printf("Sorted results:\n");
for (i = 0; i < n; i++)
{
puts(pStr[i]); /* 输出排序后的n个字符串 */
}
return 0;
}
void SortString(char* ptr[M], int n)
{
int i, j;
char* temp = NULL;
for (i = 0; i < n - 1; i++)
{
for (j = i + 1; j < n; j++)
{
if (strcmp(ptr[j], ptr[i]) < 0)
{
temp = ptr[j];
ptr[j] = ptr[i];
ptr[i] = temp;
}
}
}
}
- 关键点:
- 指针指向的字符串,其实是指向字符数组的第一号元素的地址,也是这一个数组的地址
- 字符串不能直接赋值给指针,但可以通过初始化的形式将字符串赋值给指针