【问题标题】:C Bubble Sort Integer Array - Output IssueC 冒泡排序整数数组 - 输出问题
【发布时间】:2019-03-04 01:45:04
【问题描述】:

这里是新手。

对于我的 C 编程课程,我需要使用冒泡排序来对从输入 .txt 文件中读取的列表进行排序。 .txt 文件中的每一行都有年份、名称和受飓风影响的州 [year] [name] [states]。

例如:

1999 Floyd NC
2003 Isabel NC, VA
2004 Charley FL, SC, NC
2004 Frances FL
...etc.

程序需要按年份对列表进行排序,同时保持所有数据行正确(将相关数组元素保持在一起)。我的整数数组冒泡排序工作正常,除了一个问题 - 一行数据位于列表的一侧。这是此问题的示例输出:

    1960    Donna    FL, NC
    1969    Camille  MS     1972    Agnes    FL
    1983    Alicia   TX
    2004    Charley  FL, SC, NC

1972 Agnes FL 行几乎是正确的,但由于某种原因打印到侧面而不是前一行的正下方。

代码:

#include <stdio.h>
#include <string.h>

#define MAX_HURCS 30

int main() {
    FILE *hurricaneData;
    int year[MAX_HURCS];
    char name[MAX_HURCS][50];
    char states[MAX_HURCS][50];
    int i = 0, j;
    int count = 0;
    int sort;
    int tempYear;
    char tempName[50];
    char tempStates[50];

    if ((hurricaneData = fopen("hurricanes2.txt", "r")) == NULL) {
        printf("Error: Could not open file");
    }

    while ((fscanf(hurricaneData, "%d %s", &year[i], &name[i]) != EOF)
        && (fgets(states[i], 50, hurricaneData) != NULL)) {
        i++;
        count++;
    }

    for (i = 0; i < count - 1; i++) {
        for (j = 0; j < count - 1 - i; j++) {
            if (year[j] > year[j + 1]) {
                tempYear = year[j];
                year[j] = year[j+1];
                year[j+1] = tempYear;

                strcpy(tempName, name[j]);
                strcpy(name[j], name[j+1]);
                strcpy(name[j+1], tempName);

                strcpy(tempStates, states[j]);
                strcpy(states[j], states[j+1]);
                strcpy(states[j+1], tempStates);
            }
        }
    }
    for (i = 0; i < count; i++) {
        printf(" \t%d\t%s\t%s ", year[i], name[i], states[i]);
    }
    return 0;
}

我也尝试过这个排序算法,但我遇到了同样的问题:

for (i = 0; i < count; i++) {
    for (j = 0; j < count; j++) {
        if (year[j] > year[i]) {
            tempYear = year[i];
            year[i] = year[j];
            year[j] = tempYear;

            strcpy(tempName, name[i]);
            strcpy(name[i], name[j]);
            strcpy(name[j], tempName);

            strcpy(tempStates, states[i]);
            strcpy(states[i], states[j]);
            strcpy(states[j], tempStates);
        }
    }
}

【问题讨论】:

  • 尝试在 printf printf(" \t%d\t%s\t%s\n", year[i], name[i], states[i]) 中手动给出 \n ;
  • 有趣。当我这样做时,输出列表会按顺序打印出来,该数据行位于另一行下方,只是没有换行符。所以它在技术上是正确的,但我相信最后一步仍然存在问题。
  • This??,我认为错误是文件中的最后一行没有行尾字符,因此它会读取到文件末尾,并且当它打印同一行时它不会移动到下一行,所以要么转到文本文件的最后一行并在最后一行放置一个 endl,要么为每一行手动打印一个 endl,而你之前的评论我没有看到新的输出
  • @TomKarzes fgets 函数无论如何都会从文本文件中读取新行,因此在每一行之后添加一个额外的新行是没有意义的,问题是文本文件中的最后一行没有新的行。
  • @Anil 是的,当我仔细观察时,我意识到了这一点。排序时携带换行符似乎很奇怪。通常它们会在读取记录时被剥离,因为它们不是数据的一部分,然后在输出结果时插入。这是解决此问题的正确方法。

标签: c arrays sorting integer bubble-sort


【解决方案1】:

我认为错误是文件中的最后一行没有行尾字符,因此它会读取到文件末尾,并且当它打印同一行时它不会移动到下一行,所以要么转到最后一行在您的文本文件中并在最后一行放置一个 endl 或为每一行手动打印一个 endl。另一种或更通用的方法是从您的输入中删除新行,可以这样做,而阅读文本这样做

int len = strlen(states[i]);
if(len>0 && states[i][len-1] == '\n')
{
    states[i][len-1] = '\0';
}

这将删除所有新行,然后您可以在 printf 中手动打印它们

【讨论】:

  • 这是正确的,我明白了。非常感谢您对此@Anil 的帮助。
  • 您还需要检查长度是否非零。如果遇到没有换行符的空字符串,上面的代码是不安全的。在这种情况下,它将索引超出字符串的开头,甚至可能修改内容。
  • 看起来你修好了。希望 OP 会注意到修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 2013-09-28
  • 2015-01-27
相关资源
最近更新 更多