strcmp和strcpy被打破了。当我尝试在C中按字母顺序排序时,我丢了一个字

时间:2018-01-06 22:46:03

标签: c strcmp

现在我正在开展一个更大的项目。这是一个很长的故事,圣诞老人需要一些帮助,他有一些城市和一些玩具。我需要一个按字母顺序排列我的城市的功能,但我做了一个但是,它在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

我不知道锄头但是我失去了一座城市:\任何形式的帮助都会很棒

1 个答案:

答案 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

仔细看看,如果您有其他问题,请告诉我。