现在我正在开展一个更大的项目。这是一个很长的故事,圣诞老人需要一些帮助,他有一些城市和一些玩具。我需要一个按字母顺序排列我的城市的功能,但我做了一个但是,它在9次测试中工作正常,最后一次测试结果是错误的。这是我的功能
void f_sort_city (structura_output s[], int n) {
int i, j;
structura_output AUX;
for (i = 0; i < n; i++) {
for (j = i + 1; j < n; j++) {
if (strcmp(s[i].city, s[j].city) > 0) {
strcpy(AUX.city, s[i].city);
strcpy(s[i].city, s[j].city);
strcpy(s[j].city, AUX.city);
strcpy(AUX.toy, s[i].toy);
strcpy(s[i].toy, s[j].toy);
strcpy(s[j].toy, AUX.toy);
AUX.nr_toy = s[i].nr_toy;
s[i].nr_toy = s[j].nr_toy;
s[j].nr_toy = AUX.nr_toy;
}
}
}
}
如果我在订购之前打印城市,一切都很好,但是在我失去一个城市之后
这是我使用的结构
typedef struct {
char city[100];
char toy[100];
int nr_toy;
} structura_output;
不能告诉你我的输入它有400多行,但我使用的城市是
ADDISA_ABABA MALABO
ALGER
亚穆苏克罗
布琼布拉
DJIBOUTI
阿斯马拉
KINSHASA
布拉柴维尔
开罗
我的输出是
ADDISA_ABABA
ALGER
阿斯马拉
布拉柴维尔
布琼布拉
开罗
&GT;
DJIBOUTI
KINSHASA
MALABO
我不知道锄头但是我失去了一座城市:\任何形式的帮助都会很棒
答案 0 :(得分:1)
你并不遥远,但你正在使事情变得比他们需要的更难。由于数组的所有成员都是固定长度的,因此您只需指定结构即可。无需复制每个成员的深层复制。 (如果您的成员中有多个间接级别,例如指向指针的指针),则需要这样做
将您的f_sort_city
功能缩短为:
void f_sort_city (structura_output s[], int n) {
int i, j;
structura_output AUX;
for (i = 0; i < n; i++) {
for (j = i + 1; j < n; j++) {
if (strcmp(s[i].city, s[j].city) > 0) {
AUX = s[i]; /* no need to copy elements */
s[i] = s[j];
s[j] = AUX;
}
}
}
}
接下来,根据您阅读数据文件的方式(您没有显示代码),如果您正在阅读面向行的读取(例如fgets
或POSIX getline
)确保删除函数包含的尾随'\n'
读取。
请勿在代码中使用幻数,例如char city[100];
等。如果您需要常量,#define
他们(或使用enum
),例如
#define MAXC 100 /* don't use 'magic numbers in your code */
#define MAXS 128 /* if you need constants, define them. */
完全放弃,您可以实现您的阅读(来自stdin
)并按以下类似排序:
#include <stdio.h>
#include <string.h>
#define MAXC 100 /* don't use 'magic numbers in your code */
#define MAXS 128 /* if you need constants, define them. */
typedef struct {
char city[MAXC];
char toy[MAXC];
int nr_toy;
} structura_output;
void f_sort_city (structura_output s[], int n) {
int i, j;
structura_output AUX;
for (i = 0; i < n; i++) {
for (j = i + 1; j < n; j++) {
if (strcmp(s[i].city, s[j].city) > 0) {
AUX = s[i]; /* no need to copy elements */
s[i] = s[j];
s[j] = AUX;
}
}
}
}
int main (void) {
structura_output s[MAXS] = { {.city = ""} };
size_t len, ndx = 0;
while (ndx < MAXS && fgets (s[ndx].city, MAXC, stdin)) {
len = strlen (s[ndx].city); /* get length */
if (len && s[ndx].city[len - 1] == '\n') /* test for newline */
s[ndx].city[--len] = 0; /* trim newline */
ndx++; /* increment index */
}
f_sort_city (s, ndx); /* sort data */
for (size_t i = 0; i < ndx; i++) /* output sorted data */
printf ("s[%3zu] : %s\n", i, s[i].city);
return 0;
}
(注意:您还应检查是否已读取完整的数据行,方法是检查len + 1 == MAXC
'\n'
是否失败)
示例输入文件
$ cat dat/cities.txt
ADDISA_ABABA MALABO
ALGER
YAMOUSSOUKRO
BUJUMBURA
DJIBOUTI
ASMARA
KINSHASA
BRAZZAVILLE
CAIRO
示例使用/输出
$ ./bin/sortcities < dat/cities.txt
s[ 0] : ADDISA_ABABA MALABO
s[ 1] : ALGER
s[ 2] : ASMARA
s[ 3] : BRAZZAVILLE
s[ 4] : BUJUMBURA
s[ 5] : CAIRO
s[ 6] : DJIBOUTI
s[ 7] : KINSHASA
s[ 8] : YAMOUSSOUKRO
仔细看看,如果您有其他问题,请告诉我。