您好我正在创建一个程序,该文件从文件中读取并输出文本中每个类别的内容,例如我希望它输出如下:
Company name: air france Date of creation: 06281957 Flight number: AT6801 Incoming city: london Arrival city: paris Amount of fuel liters left: 380 Plane category: B777
这是输入:
air qatar06281957AT680londonmadrid380B777 turkish airlines05201933TK1298istanbulmadrid250A380 lufthansa01061953LH29frankfurtmadrid75B747 air canada06281957AT7245ammanmadrid120A320 turkish airlines05201933TK1266dohamadrid522A320 air france10071933AF123parismadrid105B777 -1
代码:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
FILE *inp,*outp;
int i,j,c=0,l,c2=0,c3=0;int c4=0;int c5=0,c6=0,k,m,c7=0,flag=0;int c8=0,c9=0,c10=0,flag2=0,n,c11=0,c12=0,c13=0,c14=0,p=0,c15=0,c16=0,t,t1,t2,t3,t4,t5,t6,t7,s;
char ultimate_array[600];char plane[100][6];char date[600][6];char nflight[600][6];char destination[100][6];char fuel [100][6];char planetype [100][6];
inp=fopen("input.txt","r");
for(i=0;!feof(inp);i++)
{
fscanf(inp,"%c",&ultimate_array[i]);
}
s=strlen(ultimate_array);
for(i=0;i<s;i++)
{
printf("%c",ultimate_array[i]);
}
printf("\n\n\n\n\n\n\n\n\n\n\n\n");
for(t=0;t<6;t++)
{
for(j=0;j<200;j++)
{
c++;
if(isdigit(ultimate_array[j]))
{
c3=c;
while(c>=0)
{
plane[t][c]=ultimate_array[j];
c--; j--;
}
break;
}
}
for(k=0;k<200;k++)
{
c2++;
if(isupper(ultimate_array[k]))
{
c5=c2; c2=c2-c3; c9=c2;
while(c2>=0)
{
date[t][c2]=ultimate_array[k];
k--; c2--;
}
break;
}
}
for(l=c3;l<200;l++)
{
c4++;
if(islower(ultimate_array[l]))
{
c4=c4+c3-c5;
while(c4>=0)
{
while(flag==0)
{
c8=c4; c6=c4+c5; flag=1;
}
nflight[t][c4]=ultimate_array[l];
c4--; l--;
}
break;
}
}
c10=c9+c8;
for(m=c6;m<200;m++)
{
c7++;
if(isdigit(ultimate_array[m]))
{
c7--;m--;
while(c7>=0)
{
while(flag2==0)
{
c13=c7; flag2=1;
}
destination[t][c7]=ultimate_array[m];
c7--; m--;
}
break;
}
}
for(n=c14;n<200;n++)
{
c11++; c14=c3+c13+c10;
if(isupper(ultimate_array[n]))
{
c12=c11; c11=c11-1;
while(c11>=0)
{
fuel[t][c11]=ultimate_array[n];
c11--; n--;
}
break;
}
}
c15=c14+c12;
for(p=c15;p<200;p++)
{
c16++;
if(ultimate_array[p]=='\n')
{
while(c16>=0)
{
planetype[t][c16]=ultimate_array[p];
c16--; p--;
}
break;
}
}
for(t1=0;t1<20;t1++)
{
printf(" %c",plane[t1][t]);
}
printf("\n");
for(t2=0;t2<100;t2++)
{
printf("%c",destination[t2][t]);
}
printf("\n");
for(t3=0;t3<100;t3++)
{
printf("%c",date[t3][t]);
}
printf("\n");
for(t4=0;t4<100;t4++)
{
printf(" %c",fuel[t4][t]);
}
printf("\n");
for(t5=0;t5<100;t5++)
{
printf(" %c",nflight[t5][t]);
}
printf("\n");
for(t6=0;t6<5;t6++)
{
printf(" %c",planetype[t][t6]);
}
}
return 0;
}
我一直在努力解决很多问题,但我终于设法将每个类别分成不同的数组,然而,当我尝试为2D数组做这件事我总是得到垃圾时有人能指出我做错了什么?
我们无法在输入文件中读取并将其写入2D数组中,因此我在此代码中使用的概念在数组中搜索,直到找到可帮助我将该单词与其他单词分开的内容,例如06281957在输入我使用isdigit来识别哪个索引有它然后我将前面的字符复制到一个新的数组这个技巧似乎适用于1d阵列但是当我试图扫描它到2d它停止工作,只有随机字符似乎appeari想要打印每个类别的整个2d数组,但我没有这样做,因为变量我用它们作为下一次检查的检查点,将我想要的东西放在一个新的数组中。为了最小化代码我似乎无法找到另一个解决方案,我知道我的代码非常大,但如果有人有更好的想法,它会很棒。
答案 0 :(得分:0)
简化代码的一件事是使用scansets。它可以更容易地从非数字中提取和分隔数字,从大写字母开始。 Fixed width specifiers也是您应该阅读的概念。要查看提取的字符数,请使用上一个链接中描述的%n
。例子:
/* ... */
inp=fopen("input.txt","r");
/* your code... */
for(i=0;!feof(inp);i++)
{
fscanf(inp,"%c",&ultimate_array[i]);
}
s=strlen(ultimate_array);
for(i=0;i<s;i++)
{
printf("%c",ultimate_array[i]);
}
/* ...can be replaced by something similar to this (untested) */
fscanf(inp, "%599s%n", ultimate_array, &s); /* read up to 599 characters, put number of read characters in s */
ultimate_array[s]=0; /* set null terminator */
char a[10]; sprintf(a, "%%%ds", s); /* create print format, e.g. "%123s" */
printf(a, ultimate_array) /* print 's' number of characters */
请务必将其放慢,因为最初的线条很难读取。随着您越来越熟悉它,我相信您会发现scanf
确实需要&#34;确切地说需要什么&#34;根本不使用循环或条件。
不要使用feof
。而是从scanf
检查返回值。如果您尝试提取单个&#34;某些东西&#34;从文件使用scanf
并返回0(填充零参数),您已完成阅读文件。
制作2D数组几乎总是错误的。将结构中的变量分组:
typedef struct flights_t {
char plane[100];
char date[100];
/* ... */
} flights[6]; unsigned int nrOfFlights = 0;
int c[16];
int t[7];
制作符号常量,而不是使用20
,100
和6
的副本来代码,以提高可读性和维护性。您还可以从SO等论坛获得更好的帮助。
如果没有正确描述每个代码部分应该执行的操作,那么您发布的代码将无法保存。希望这个&#34;回答&#34;将帮助您制作更好的代码。