【发布时间】:2016-08-06 16:38:25
【问题描述】:
我正在尝试编写一个程序来读取文本文件并将每一行分成单独的数组,以便可以按日期和名称对它们进行排序。我仍然无法让“按日期排序”功能正常工作/显示,这就是为什么我还没有尝试按名称排序功能。
我似乎能够很好地扫描日期和名称数组,但我认为我需要修改扫描最后一个数组“日期”的方式,因为我需要在逗号后用空格分隔它们。问题是我不确定如何将它们作为字符串扫描,因为它们之间会有空格,并且某些名称具有不同数量的状态。 (此时我删除了文本文件中状态之间的空格,但文本文件可能需要将它们放回原处?)
到目前为止我的代码...
#include <stdio.h>
#include <string.h>
#define MAX 30
void sortByDate( int year[], char *name[], char *states[], int count);
void sortByName(int year[], char name[], char states[], int count);
int main()
{
int year[MAX];
int i, a;
int count = 0;
int choice;
char *name[MAX],
*states[MAX];
char b[MAX], c[MAX];
FILE *inp = fopen("hurricanes.txt","r"); /* defining file input */
for(i=0;i<MAX;i++)
{
if( feof(inp) )
{
break;
}
fscanf(inp, "%d", &a);
fscanf(inp, "%s", &b);
fscanf(inp, "%s", &c);
year[i]=a;
strcpy(&name[i],b);
strcpy(&states[i],c);
++count;
printf("%d %s %s\n", year[i], &name[i], &states[i]);
}
printf("Press 0 to sort by date or 1 to sort by name: ");
scanf("%d", &choice);
if (choice == 0)
{
sortByDate(year, name, states, count);
}
else if ( choice == 1)
{
//sortByName(year, name, states, count);
}
getch();
return 0;
}
void sortByDate( int year[], char *name[], char *states[], int count )
{
int d = 0;
int c = 0;
int yearTmp;
char nameTmp[MAX], statesTmp[MAX];
int order[count];
int tmp = 0;
FILE *outp = fopen("report.txt","w"); /* defining file output */
for (c = 0; c < count; ++c)
{
order[c] = c;
}
for (c = 0 ; c < ( count - 1 ); c++)
{
for (d = 0 ; d < count - c - 1; d++)
{
if (year[d] > year[d+1])
{
yearTmp = year[d];
year[d] = year[d+1];
year[d+1] = yearTmp;
tmp = order[d];
order[d] = order[d+1];
order[d+1] = tmp;
}
}
}
for (c = 0; c < count; ++c)
{
printf("%d %-10s %s\n", year[c], &name[order[c]], &states[order[c]]);
}
}
//void sortByName(int year[], char name[], char states[], int count)
//{
//}
hurricanes.txt 文件....(我再次删除了状态之间的空格,但我认为需要将它们放回原处并进行不同的扫描?)
1960 Donna FL,NC
1969 Camille MS
1972 Agnes FL
1983 Alicia TX
1989 Hugo SC,NC
2005 Katrina FL,LA,MS
2005 Rita TX,LA
2005 Wilma FL
2008 Ike TX
2009 Ida MS
2011 Irene NC,NJ,MA,VT
2012 Isaac LA
1992 Andrew FL,LA
1995 Opal FL,AL
1999 Floyd NC
2003 Isabel NC,VA
2004 Charley FL,SC,NC
2004 Frances FL
2004 Ivan AL
2004 Jeanne FL
好的,所以我对此处发布的建议进行了一些更改,效果很好!
【问题讨论】:
-
如果你想
scanf()一个可以包含空格的字符串,你需要"%[]",而不是"%s"。 -
要读取包含空格的字符串,您可以使用
"%N[^\n]",其中N是向量的最大大小 - 1。这将读取到行尾或 N 个字符,无论先发生什么。 -
strcpy(&name[i],b);-->name[i] = strdup(b); -
感谢 BLUEPIXY。你的建议也奏效了。
标签: c arrays sorting c-strings