/**字符串排序*/
#include<stdio.h>
#include<string.h>
#define N 10
void Sort_String(char arr[][50], int size)
{
char tmp[50];
if(arr == NULL || size < 2)//字符串个数小于2的直接返回,不用排序
{return;}
for(int i = 0; i < size - 1; i++)
{
for(int j = 0; j < size - i - 1; j++)
{
if(strcmp(arr[j], arr[j + 1]) > 0)
{
//利用冒泡的排序算法对字符串进行排序
strcpy(tmp,arr[j]);
strcpy(arr[j],arr[j + 1]);
strcpy(arr[j + 1],tmp);
}
}
}
}
void find(char arr[][50], int size){
int i;
char str[50];
printf("请输入你要查找的城市:\n");
scanf("%s",str);
getchar();
for(i=0;i<N;i++){
if(strcmp(arr[i],str)==0){printf("已查找到!\n");return ;}
}
printf("没有找到!\n");
return ;
}
int main(){
int n,i;
char arr[N][50];
FILE *fp;
fp=fopen("city.txt","r");
if(fp==NULL)
{
printf("文件打开失败!\n");
}
else{
for(i=0;i<N;i++)
{
fscanf(fp,"%s\n",arr[i]);
}
}
fclose(fp);
Sort_String(arr,N);
printf("排序后:\n");
for(i=0;i<N;i++){
puts(arr[i]);
}
printf("\n");
find(arr,N);
return 0;
}
修改一下
#include <stdio.h>
#include <string.h>
#define CITYNUM 10
int main()
{
int i,j,k,num;
char city[CITYNUM][20];
char string[80];
num=0;//实际输入的城市数初始为0
for(i=0;i<CITYNUM;i++)
{printf("input the number of the %dth city:",i+1);
gets(str);//输入城市名
if(str[0]==0)//为空串,表示输入结束
break;
if(strlen(str)>19)//城市名字符串大于19时重输
{
i--;
continue;}
strcpy(city[i],str);//将输入的城市名保存到字符串数组中
num++;}
for(i=0;i<num-1;i++)
{
k=i;//k为当前城市名中最小的字符串数组中的下标,初始值假设为i
for(j=i+1;j<num;j++)、、查找比city[k]小的字符串的下标并放入k中
if(stricmp(city[k],city[j]>0)
k=j;
if (k!=i)//将最小城市名的字符串city[k]与city[i]交换
{
strcpy(str,city[i]);
strcpy(city[i],city[k]);
strcpy(city[k],str);
}
}
for (i=0;i<num;i++)//显示排序后的结果
printf("%S",city[i]);
printf("\n");
return 0;
}
示例代码如下,望采纳:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CITIES 100
// 城市名的最大长度
#define MAX_CITY_NAME_LEN 50
// 城市名结构体
typedef struct {
char name[MAX_CITY_NAME_LEN];
} City;
// 从文件中读取城市名
int read_cities_from_file(const char *filename, City *cities, int max_cities) {
FILE *fp = fopen(filename, "r");
if (fp == NULL) {
printf("Error: Unable to open file %s\n", filename);
return 0;
}
int num_cities = 0;
while (num_cities < max_cities && fscanf(fp, "%s", cities[num_cities].name) == 1) {
num_cities++;
}
fclose(fp);
return num_cities;
}
// 城市名比较函数,用于 qsort 函数
int compare_cities(const void *a, const void *b) {
const City *city_a = (const City *)a;
const City *city_b = (const City *)b;
return strcmp(city_a->name, city_b->name);
}
// 在城市名数组中查找给定的城市名
int find_city(const City *cities, int num_cities, const char *city_name) {
for (int i = 0; i < num_cities; i++) {
if (strcmp(cities[i].name, city_name) == 0) {
return i;
}
}
return -1;
}
int main(int argc, char **argv) {
if (argc < 2) {
printf("Usage: %s cities_file\n", argv[0]);
return 1;
}
// 从文件中读取城市名
City cities[MAX_CITIES];
int num_cities = read_cities_from_file(argv[1], cities, MAX_CITIES);
if (num_cities == 0) {
return 1;
}
// 对城市名进行升序排序
qsort(cities, num_cities, sizeof(City), compare_cities);
char city_name[MAX_CITY_NAME_LEN];
printf("Enter a city name: ");
// 读取用户输入的城市名
scanf("%s", city_name);
// 在城市名数组中查找给定的城市名
int index = find_city(cities, num_cities, city_name);
if (index >= 0) {
printf("City found at index %d\n", index);
} else {
printf("City not found\n");
}
return 0;
}
详细代码实现如下,望采纳
#include <stdio.h>
#include <string.h>
#define N 100
// 声明函数
void sort(char (*city)[N], int n);
int search(char (city)[N], int n, char target);
int main() {
// 从文件中读取城市名
char city[N][N];
int n = 0;
FILE* fp = fopen("city.txt", "r");
while(fgets(city[n], N, fp)) {
city[n][strlen(city[n]) - 1] = '\0';
// 去掉换行符
n++;
}
fclose(fp);
// 对城市名进行升序排序
sort(city, n);
// 用户输入一个城市名
char target[N];
printf("请输入要查找的城市名:");
scanf("%s", target);
// 在城市名中查找
int result = search(city, n, target);
if(result == -1) {
printf("没有找到\n");
} else {
printf("已查找到\n");
}
return 0;
}
// 实现函数
void sort(char (*city)[N], int n) {
// 冒泡排序
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if(strcmp(city[j], city[j + 1]) > 0) {
char tmp[N];
strcpy(tmp, city[j]);
strcpy(city[j], city[j + 1]);
strcpy(city[j + 1], tmp);
}
}
}
}
int search(char (city)[N], int n, char target) {
// 二分查找
int left = 0, right = n - 1;
while(left <= right) {
int mid = (left + right) / 2;
if(strcmp(city[mid], target) == 0) {
return mid;
} else if(strcmp(city[mid], target) < 0) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}