Удаление строки с наибольшим количеством разных символов - C (СИ)
Формулировка задачи:
Всем привет, многие недели бьюсь над загадкой следующего задания: "Скопировать содержимое текстового файла, удалив строку с наибольшим кол-вом разных символов.". Совместив одну, другую, третью программы, а так же функции из библиотеки string.h я почти смог добиться результата, но не тут-то было. Невиданные ранее ошибки нанесли ответный удар. А потом ещё удар. И ещё. Сил нет, помогите пожалуйста.
Логика моей программы: считываем файл, в нём в каждой строке считаем каждое первое появление каждого символа. Сумму этих появлений записываем в переменную. Если разных символов в строке получилось больше, чем в переменной, в которой мы храним это кол-во, значит в другую переменную записываем строчку. И так цикл проходит все строчки в файле, а потом выводит все строки, кроме той, в которой больше всего разных символов. Ну, я хотел бы, чтобы оно так работало. Но не работает.
Спасите.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main( )
{
FILE *f1,*f2,*f3;
int ch;
int st;
int st2;
int stmax = 0;
char maxline[255];
char str[50];
if ((f1 = fopen("first.txt","r")) == NULL)
{
fprintf(stdout, "Error opening file first.txt");
exit(1);
}
if ((f2 = fopen("second.txt","w")) == NULL)
{
fprintf(stdout, "Error opening file second.txt");
exit(1);
}
if ((f3 = fopen("second.txt","r")) == NULL)
{
fprintf(stdout, "Error opening file second.txt");
exit(1);
}
printf("Before:\n");
while (feof(f1)==0)
{
st = fgets(str,sizeof(str),f1);
int i;
int count1;
for (i = 0; i <strlen(st); ++i)
{
char * pch;
int count2 = 0;
pch=strchr(st,st[i]);
if (pch != NULL)
{
if (count2 == 0)
{
count1 += 1;
count2 += 1;
}
}
}
if (stmax < count1)
{
maxline = st;
}
fputs(st,f2);
fputs(st,stdout);
}
fclose(f2);
printf("\n");
printf("\n");
printf("After:\n");
while (feof(f3)==0)
{
st2 = fgets(str,sizeof(str),f3);
if (st2 == maxline)
{
}
else
{
printf ("%s", st2);
}
}
fclose(f1);
fclose(f3);
}Решение задачи: «Удаление строки с наибольшим количеством разных символов»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fin, *fout;
int i, j, flag = 0, nc = 0, max = 0, ns = 1, str;//nc - счетчик неповторяющихся символов
char s[80]; //ns - счетчик строк
fin = fopen("input.txt", "r");
fout = fopen("output.txt", "w");
while(fgets(s, 80, fin)){
for(i = 0; i < strlen(s) - 2; i++){
for(j = 0; j < strlen(s) - 1; j++){
if(s[i] == s[j] && i != j)//в цикле проверяем каждый элемент строки на повторяемость
flag = 1;
}
if(flag == 0)//если символ не повторяется
nc++;//счетчик увеличивается на 1
else
flag = 0;
}
if(max < nc){//ищем максимальное кол-во неповторяемых символов
max = nc;
str = ns;//записываем в какой строке max
}
ns++;
nc = 0;
}
ns = 1;
fclose(fin);
fin = fopen("input.txt", "r");
while(fgets(s, 80, fin)){//повторно считываем исходный файл
if(ns != str)//и,за исключением строки с max,
fputs(s, fout);//печатаем его в выходной файл
ns++;
}
fclose(fin);
fclose(fout);
return 0;
}