新手在这里。
对于我的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);
}
}
}
答案 0 :(得分:0)
我认为错误是文件的最后一行没有行尾字符,因此读取到文件末尾,并且在打印同一行时不会移动到下一行,所以要么转到最后一行在文本文件中,将endl放在最后一行,或手动为每行打印一个endl。另一种或更通用的方法是从输入中删除新行,可以像这样在阅读文本时这样做
int len = strlen(states[i]);
if(len>0 && states[i][len-1] == '\n')
{
states[i][len-1] = '\0';
}
这将删除所有新行,然后您可以在printf中手动打印它们