Получить те символы, принадлежащие последовательности, которые входят в нее одни раз - C (СИ)
Формулировка задачи:
Задача
Дана последовательность символов S1,s2...Sn n=>2 . Получить те символы,принадлежащие последовательности ,которые входят в нее одни раз
выдает ошибку в строке "fscanf(file,"%c",&(p->elem));" подскажите что не так, и правильно ли вообще сделат ввод и вывод данных?
#include <iostream>
struct list
{ list *next;
char elem;}*ph;
int main ()
{
FILE *file;
file=fopen("input.txt","r");
list *p,*r,*z;
ph=new list;
ph->next=NULL;
p=ph;
p=new list;
p->next=new list;
p->elem =NULL;
do
{ p=p->next;
fscanf(file,"%c",&(p->elem));
p->next=new list;
}
while (p->elem!='\n');
for (p=ph;p->next!=NULL;p->next)
{ int t=0;
for(r=p->next;r!=NULL;r=r->next)
{ if (p==r)
{z=r->next;
r->next=r->next->next;
delete z;
t=1;
};
r=r->next;
};
if(t==1)
{ z=p->next;
p->next=p->next->next;
delete z;
};
p=p->next;
};
file=fopen("output.txt","w");
do
{ p=p->next;
fprintf(file,"%c",(p->elem));
}
while(p->elem!='\n');
fclose(file);
}Решение задачи: «Получить те символы, принадлежащие последовательности, которые входят в нее одни раз»
textual
Листинг программы
#include <stdio.h>
#include <limits.h>
#define FILE_NAME "file.txt"
int main(void){
FILE * f;
int cnt[UCHAR_MAX + 1] = { 0 }, i;
if ( ( f = fopen(FILE_NAME, "r") ) == NULL ){
fprintf(stderr, "Can't open input file.\n");
return 1;
}
while ( ( i = getc(f) ) != EOF )
cnt[i]++;
fclose(f);
for ( i = 0; i < UCHAR_MAX + 1; ++i )
if ( cnt[i] == 1 )
putchar(i);
putchar('\n');
return 0;
}
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы с файлами и для определения диапазона значений символов.
- Объявление имени файла, с которым будет работать программа.
- Объявление переменной
fтипаFILE*для работы с файлом. - Проверка открытия файла и вывод сообщения об ошибке в случае неудачи.
- Установка значения переменной
iравнымEOFперед выходом из цикла. - Организация цикла, который выполняется до тех пор, пока не достигнут конец файла.
- Увеличение счетчика символа в массиве
cntна единицу. - Закрытие файла после окончания чтения.
- Организация цикла для вывода символов, которые встречаются в файле только один раз.
- Вывод символа, который является текущим элементом цикла.
- Возврат 0 для успешного выполнения программы.