我最近开始了一个程序,我必须对其中的客人列表进行排序,但总体问题的详细信息对于我遇到的问题是不敬的。
好吧,我想从SEPARATELY文件中扫描名字和姓氏,我知道你将它们扫描为字符串。然而,我们刚刚开始使用字符串,我有一点脑屁,我搜索过的地方,但我无法弄清楚如何这样做。我也在构造for循环中的数组时遇到了麻烦。自“天际”出来后,我的思绪完全失控了:)。这是输入文本文件:
//First number is the amount of families on the list, second number is the room capacity, ignore that for now.
10 30
//Format = First Name, Last Name, Number of Family Members (ignore), Priority Level (ignore)
BEN JOHNSON 4 2
DOUG ESPINOSA 3 2
SARAH TELLINGER 5 3
GRANT THOMPSON 5 2
JENNIFER WEST 7 6
JACKSON JOHNSON 1 5
MARTY MCFLY 4 1
ELIZABETH JAMES 2 6
MICKEY MOUSE 2 4
RAJ SHAH 2 5
到目前为止,这是我的代码:假设MAX_FAMILY_MEMBERS = 10且MAX_NAME_LENGTH = 20
void Read_First_Name(FILE *ifp, char First_Name[//Assume MAX_FAMILY_MEMBERS is here][MAX_NAME_LENGTH]){
int i, j;
for(i = 0; i < MAX_FAMILY_MEMBERS; i++)
{
for(j = 0; j < MAX_NAME_LENGTH; i++)
{
fscanf("%s", First_Name[i][j]);
}
}}
我确信这很可能是错的,但是我很困惑并且没有。如果对我的计划有任何疑问,请询问。
答案 0 :(得分:0)
如果你在一个循环中使用带有sscanf的fgets就很容易了,比如
char line[100], firstnames[100][100], famnames[100][100];
int counter=0;
while( fgets(line,100,yourfilepointer) )
if( sscanf(line,"%s%s",firstnames[counter],famnames[counter])==2 )
++counter;
...
while( counter-- )
printf("%s %s\n",firstnames[counter],famnames[counter]);
答案 1 :(得分:0)
我假设你想根据他们的优先级对家庭进行排序。在您编写的代码中,
您的fscanf语法不正确。再次阅读语法。
for(i = 0; i < MAX_FAMILY_MEMBERS; i++)
{
for(j = 0; j < MAX_NAME_LENGTH; i++)
{
fscanf("%s", First_Name[i][j]);
}
}
你想逐行阅读(按家庭分列)是好的,但你如何阅读每个家庭是不合适的。
%s格式说明符读取整个字符串,直到遇到空格。 所以第二个for循环非常混乱。
我会略微改变代码,你可以改进它并编写自己的逻辑
#define NUMBEROFFAMILIES 10
#define FAMILYNAMELENGTH 20
char firstName[NUMBEROFFAMILIES][FAMILYNAMELENGTH]; // to store first name
char secondName[NUMBEROFFAMILIES][FAMILYNAMELENGTH]; // to store second name
int familtyPriority[NUMBEROFFAMILIES][1]; // to store priority
int i, j;
for(i = 0; i < MAX_FAMILY_MEMBERS; i++){
fscanf(ifp,"%s",firstName[NUMBEROFFAMILIES]); // read first name
fscanf(ifp,"%s",secondName[NUMBEROFFAMILIES]); // read second name
fscanf(ifp,"%d", &j); // Ignore family members count
fscanf(ifp,"%d", &familtyPriority[NUMBEROFFAMILIES][1]); // family priority
}
编辑下一个问题
您希望根据优先级进行排序。
int familtyPriorityCopy[NUMBEROFFAMILIES][1]; // to store priority
int familyOrder[NUMBEROFFAMILIES][1]; // to store the proper order.
// initialize them
for (i=0;i<NUMBEROFFAMILIES;i++){
familtyPriorityCopy[i][1] = familtyPriority[i][1];
familyOrder[i][1] = i;
}
// sorting [insertion sort]
for (i=1;i<NUMBEROFFAMILIES;i++){
for (j=0;j<i;j++){
if (familtyPriorityCopy[j][1] < familtyPriorityCopy[i][1]){
swap(familtyPriorityCopy[i][1],familtyPriorityCopy[j][1]);
swap(familyOrder[i][1], familyOrder[j][1]);
}
}
}
最后,对familtyPriorityCopy数组进行排序。但这不重要。 familyOrder数组指向正确的顺序。我们将使用此数组以正确的顺序打印它们。
for(i = 0; i < MAX_FAMILY_MEMBERS; i++){
printf("%s",firstName[familyOrder[i][1]][1]); // read first name
printf("%s",secondName[familyOrder[i][1]][1]); // read second name
printf("%d", familtyPriority[familyOrder[i][1]][1]); // family priority
}
答案 2 :(得分:0)
void Read_And_Store(FILE *ifp, int FAMILIES_KNOWN, char First_Name[][MAX_NAME_LENGTH], char Last_Name[][MAX_NAME_LENGTH], int Family_Members[], int Priority[]){
int i;
for(i = 0; i < FAMILIES_KNOWN - 1; i++)
{
fscanf(ifp, "%s", First_Name[i]);
fscanf(ifp, "%s", Last_Name[i]);
fscanf(ifp, "%d", &Family_Members[i]);
fscanf(ifp, "%d", &Priority[i]);
}}
这是我做的,当我打印出来时它工作正常。但是,我尝试了一些尝试按优先级对打印列表进行排序的东西,但没有一个是成功的...任何想法?在我完成排序后,剩下的只是基本的逻辑和交换。