Нахождение количества символов в строках файла
В данном фрагменте кода я хотел найти количество символов в каждой строке входного файла, т.е. записать в массив count количество для каждой строки, но программа просто виснет и ничего не выдает. Изначально k=0.
while(!feof(fin))
{
while((c=getc(fin))!='\n' && !feof(fin))
{
if(c=='"')
count[k]++;
}
k++;
count=(int*)realloc(count,(k+1)*sizeof(int));
}
Весь код: (задача в нахождении самого короткого слова, состоящего из загланых букв, начинающихся на A, за слово считается набор символов, заключенный в двойные кавычки). Считается, что в каждой строке файла четное кол-во кавычек.
#include <stdio.h>
#include <stdlib.h>
int search(const char *SInputFile, char *word)
{
FILE *fin;
fin=fopen(SInputFile,"r");
int k=0,s=0,*count,*length,i,j,best=-1,min=513,flag=0;
char **a,c;
if(!fin)
{
word[0]='F';
fclose(fin);
return -1;
}
count=(int*)malloc(sizeof(int));
while(!feof(fin))
{
while((c=getc(fin))!='\n' && !feof(fin))
{
if(c=='"')
count[k]++;
}
k++;
count=(int*)realloc(count,(k+1)*sizeof(int));
}
for(i=0;i<k;i++)
if(count[i]%2!=0)
{
word[0]='I';
fclose(fin);
return 0;
}
fseek(fin,0,SEEK_SET);
for(i=0;i<k;i++)
s+=count[i];
s=s/2;
a=(char**)malloc(s*sizeof(char*));
for(i=0;i<s;i++)
a[i]=(char*)malloc(sizeof(char));
length=(int*)malloc(s*sizeof(int));
for(i=0;i<s;i++)
length[i]=0;
for(i=0;i<s;i++)
{
j=0;
while((c=getc(fin))!='"');
while((c=getc(fin))!='"')
{
if(c!='"')
a[i][j]=c;
j++;
a[i]=(char*)realloc(a[i],j+1);
}
length[i]=j;
}
for(i=0;i<s;i++)
{
flag=0;
if(length[i]<min && a[i][0]=='A')
{
for(j=0;j<length[i];j++)
if(a[i][j]<65 || a[i][j]>90)
{
flag=1;
break;
}
}
else
flag=1;
if(flag==0)
{
best=i;
min=length[i];
}
}
if(best==-1)
{
for(i=0;i<s;i++)
free(a[i]);
free(a);
free(length);
fclose(fin);
return 0;
}
for(j=0;j<length[best];j++)
word[j]=a[best][j];
for(i=0;i<s;i++)
free(a[i]);
free(a);
free(length);
free(count);
fclose(fin);
return 0;
}
int main()
{
char name[512],word[512]={0};
int i;
if(scanf("%s",name)!=1)
{
printf("File name wasn't entered.");
return -1;
}
search(name,word);
if(word[0]=='F')
printf("File doesn't exist.");
if(word[0]=='I')
printf("Invalid input data.");
if(word[0]==0)
printf("There is not necessary word here.");
if(word[0]!='I' && word[0]!='F')
for(i=0;i<512;i++)
{
if(word[i]!=0)
printf("%c",word[i]);
}
return 0;
}
Ответы (2 шт):
Автор решения: immortal
→ Ссылка
Я исправил код: убрал лишний
while((c=getc(fin))=='"' && !feof(fin))
И вместо count[i] использовал просто переменную count; вот исправленный код:
#include <stdio.h>
#include <stdlib.h>
int search(const char *SInputFile, char *word)
{
FILE *fin;
fin=fopen(SInputFile,"r");
int s=0,count=0,*length,i,j,best=-1,min=513,flag=0;
char **a,c;
if(!fin)
{
word[0]='F';
return -1;
}
while(!feof(fin))
{
if((c=getc(fin))=='"')
count++;
if(c=='\n' || feof(fin))
{
if(count%2==1)
{
word[0]='I';
fclose(fin);
return 0;
}
s+=count;
count=0;
}
}
s=s/2;
fseek(fin,0,SEEK_SET);
a=(char**)malloc(s*sizeof(char*));
for(i=0;i<s;i++)
a[i]=(char*)malloc(sizeof(char));
length=(int*)malloc(s*sizeof(int));
for(i=0;i<s;i++)
length[i]=0;
for(i=0;i<s;i++)
{
j=0;
while((c=getc(fin))!='"');
while((c=getc(fin))!='"')
{
if(c!='"')
a[i][j]=c;
j++;
a[i]=(char*)realloc(a[i],j+1);
}
length[i]=j;
}
for(i=0;i<s;i++)
{
flag=0;
if(length[i]<min && a[i][0]=='A')
{
for(j=0;j<length[i];j++)
if(a[i][j]<65 || a[i][j]>90)
{
flag=1;
break;
}
}
else
flag=1;
if(flag==0)
{
best=i;
min=length[i];
}
}
if(best==-1)
{
for(i=0;i<s;i++)
free(a[i]);
free(a);
free(length);
fclose(fin);
return 0;
}
for(j=0;j<length[best];j++)
word[j]=a[best][j];
for(i=0;i<s;i++)
free(a[i]);
free(a);
free(length);
fclose(fin);
return 0;
}
int main()
{
char name[512],word[512]={0};
int i;
if(scanf("%s",name)!=1)
{
printf("File name wasn't entered.");
return -1;
}
search(name,word);
if(word[0]=='F')
printf("File doesn't exist.");
if(word[0]=='I')
printf("Invalid input data.");
if(word[0]==0)
printf("There is not necessary word here.");
if(word[0]!='I' && word[0]!='F')
for(i=0;i<512;i++)
{
if(word[i]!=0)
printf("%c",word[i]);
}
return 0;
}
Автор решения: Harry
→ Ссылка
Как-то тяжеловесно кажется... Может, так?
int main(int argc, const char * argv[])
{
#define BUFSIZE 512
char s[BUFSIZE], word[BUFSIZE];
int min = BUFSIZE;
printf("Filename: ");
fgets(s,BUFSIZE,stdin);
s[strlen(s)-1] = 0;
FILE * f = fopen(s,"rt");
if (f == 0)
{
fprintf(stderr,"Can not open %s\n",s);
return 1;
}
while(fgets(s,BUFSIZE,f))
{
for(char * b = strchr(s,'"'), *q; b; b = strchr(q,'"'))
{
char * e = strchr(b+1,'"'); // Всегда есть - четное число кавычек!
*e = 0; q = e+1;
if (e - b - 1 >= min || b[1] != 'A') continue;
int up = 1;
for(char * c = b+1; c < e; ++c)
if (!isupper(*c)) { up = 0; break; }
if (!up) continue;
strcpy(word,b+1);
min = strlen(word);
}
}
if (min == BUFSIZE)
printf("There are no such words\n");
else
printf("This is word \"%s\"\n",word);
}