Что нужно исправить?

Требуется написать функцию, которая сравнивает первую и последнюю строку файла (с++). Не понимаю, в чем ошибка.

#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;

char sravnenie(char *str);

int main(){
int max = 255;
char filename[max], str[max];
cout << "Vvedite imya faila: ";
cin >> filename;
ifstream fin(filename);

 if(!fin){
 cout << "File error.";
 return 1;
 }

fin.getline(str, max, '\0');

sravnenie(str);

system("pause");
return 0;
}

char sravnenie(char *str){
int i, j;
int max = 255;
char str1[max], str2[max], str3[max];

 for (i = 0; i < strlen(str); i++){
  if(str[i]!='.' || str[i]!='!' || str[i]!='?'){
  str1[i]+=str[i];
  }
 break;
 }

 for (i = strlen(str)-1; i > 0; i--){
  if(str[i]!='.' || str[i]!='!' || str[i]!='?'){
  str2[i]+=str[i];
  }
 break;
 }

j = strlen(str);

 for (i = 0; i < strlen(str); i++){
 str3[i]+=str2[j-i-1];
 }


if(str1 == str3) cout << "Stroki odinakovu." << endl;
else cout << "Stroki raznue." << endl;
}

Ответы (2 шт):

Автор решения: Zhihar
  1. если у вас записано условие

     если переменная не равна значение1 ИЛИ переменная не равна значение2
    

значит это условие будет выполняться ВСЕГДА

это касательно ваших циклов

  1. кроме того сразу после 1 этапа делать break без условия - это значит обработать лишь 1 значение цикла

  2. делать strl[i] += str[i] без инициализации (заполнения хотя бы 0) массива - значит поиметь офигительно "предсказуемые" результаты

  3. зачем вычислять отдельно j = strlen(str) если внутри циклов все равно еще раз вычисляется, причем на каждом этапе, что очень неоптимально - надо 1 раз вычислить длину строки и ее использовать

  4. if (str1 == str3) - это сравнение указателей, которые и так разные, т.е. проверка проходить никогда не будет, для сравнения строк используются функции, например strcmp

  5. вы формируете массивы размером 255 символов, но при работе с входящей строкой нигде не проверяете на выход за пределы массивов, если я передам в функцию строку размером в 1000 символов, то ваш код полезет в другие области памяти (полез бы в святые времена когда работали уязвимости переполнения буферов, а так он просто рухнет, а может все таки полезет)

  6. статический массив можно задать только через константный размер

такой код:

int size = 100;
char arr[size];

выдаст такую ошибку:

Error C2131 expression did not evaluate to a constant

надо использовать

const int size = 100;

Это я касательно вашей int max = 255;

А вообще код вообще не работающий

→ Ссылка
Автор решения: Harry

А, раз уж С++, вот так нельзя?

bool compare(const char * filename)
{
    string first,last,s;
    ifstream in(filename);
    getline(in,first);
    while(getline(in,s)) last = s;
    return first == last;
}

Равны - true, нет - false. Надо добавить обработку ошибок (ну, файл не найден, в нем пусто и т.п., но идея изложена.

→ Ссылка