这是C语言程序基础中的一道试题,在这段程序中 Fsort 函数是一个是什么逻辑,我尝试阅读但是没有读懂。我自己的理解是对字符串进行排序,我预想的结果应该是”Basic,c++,Fortan,Java,pascal“,但是结果却是”Basic,Fortan,Java,C++,pascal“,请问这是为什么。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Fsort(char* name[], int n);
void Fprintf(char* name[], int n);
void main() {
char* name[] = { "Basic","Fortan","c++","Java","pascal" };
int n = 5;
Fsort(name, n);
Fprintf(name, n);
}
void Fsort(char* name[], int n) {
char* temp;
int i, j, k;
for (i = 0; i < n - 1; i++) {
k = i;
for (j = i + 1; j < n; j++)
if (strcmp(name[k], name[j]) > 0) k = j;
if (k != i) {
temp = name[i];
name[i] = name[k];
name[k] = temp;
}
}
}
void Fprintf(char* name[], int n) {
int i;
for (i = 0; i < n; i++) {
puts(name[i]);
}
}
Fsort 函数是实现字符串排序功能,你的理解没错,你预想的结果应该是”Basic,C++,Fortan,Java,pascal“ 也没错。代码运行的结果和预想结果不同,原因是第12行代码里的那串字符串数组里 c++ 这里的 c 是小写的,而你预想的 C++ 的 C 是大写的,而字符串比较过程中,小写字符 > 大写字符,pascal 也是小写的,所以才有了这个结果:”Basic,Fortan,Java,c++,pascal“ 。
因为小写字母的ascii值比大写字母大,所以往后排。
下面是我的理解,供参考:
因为strcmp是通过ASCII码的大小来比较字符,然后代码如果检测到name数组里的字符串第一个字母ASCII码比后面的大,就交换,即实现把字符串第一个字母ASCII码按从小到大排列,实际就是先按大写字母顺序排序,再按小写字母顺序排序,因为大写字母的ASCII码比小写字母的小,所以结果就是:
Basic
Fortan
Java
c++
pascal