Porównywanie długości ciągów znaków – program nie wypisuje danych

0

Hej, mam takie oto zadanie:

W pliku napisy.txt znajduje się 200 wierszy, z których każdy zawiera dwa napisy o długości od 1 do 50 znaków, oddzielone pojedynczym odstępem. Napisy składają się wyłącznie z małych liter alfabetu angielskiego. Napisz program (lub kilka programów), który pozwoli rozwiązać poniższe zadania. Odpowiedzi zapisz w pliku wyniki.txt.

  1. Oblicz, w ilu wierszach jeden (którykolwiek) z napisów jest przynajmniej trzy razy dłuższy od drugiego.
    Jako odpowiedź wypisz liczbę takich wierszy oraz parę napisów z pierwszego z nich.

  2. Znajdź (i wypisz) wszystkie takie wiersze pliku, w których drugi napis da się otrzymać z pierwszego przez dopisanie na jego końcu pewnej dodatniej liczby liter (na przykład kot i kotara). Dla każdego wiersza podaj oba znajdujące się w nim napisy, a osobno wypisz litery, które należy dopisać.

Podpunkt 1 mam już zrobiony, mam problem natomiast z podpunktem numer 2..
Napisałem do tej pory takie coś:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{

    string s1[200],s2[200];
    ifstream napisy;
    napisy.open("napisy.txt");
    {

        for(int i=0; i<200; i++)
        {
            napisy>>s1[i];
            napisy>>s2[i];
        }
        for(int i=0; i<200; i++)
        {
            if(s1[i].length()>s2[i].length())
            {
                bool git=true;
                for(int j=0; j<s1[j].length(); j++)
                {
                if(s1[j]!=s2[j])
                git=false;
                if (git)
                {
                    cout<<s1<<s2;
                }
                }

            }

        }


    }
    napisy.close();
    return 0;
}

Problem jest taki że cout nic nie wypisuje.. Jakieś rady?

0

Już chyba ktoś kiedyś o to pytał.

std::string_view IsPrefixOf(std::string_view first, std::string_view second)
{
   if (second.substr(0, first.length()).compare(first) == 0) {
      return second.substr( first.length() );
   }
   return std::string_view();
}

Jak nie możesz użyć string_view to zamień na const std::string&

0
tajny_agent napisał(a):

Już chyba ktoś kiedyś o to pytał.

std::string_view IsPrefixOf(std::string_view first, std::string_view second)
{
   if (second.substr(0, first.length()).compare(first) == 0) {
      return second.substr( first.length() );
   }
   return std::string_view();
}

Jak nie możesz użyć string_view to zamień na const std::string&

Wybacz, jestem dopiero na pierwszym roku informatyki z liceum i niewiele z tego rozumiem. Nawet jeśli jakimś cudem to zrobię to nauczyciel mi tego nie zaakceptuje bo nie będę umiał tego wytłumaczyć.

1

Ok.

if ( s2.length() > s1.length() ) {  //drugi wyraz musi być dłuższy od pierwszego
  bool identyczne = true;
  for( int i = 0; i < s1.length(); ++i ) {  // iterujesz od 0..długość pierwszego wyrazu i sprawdzasz czy litery są identyczne
    if ( s1[ i ] != s2[ i ] ) {  // jeśli litery są różne to dalsze sprawdzanie nie ma sensu
      identyczne = false;
      break;
    }
  }
  // jeśli wszystko jest ok
  if( identyczne ) {
    std::string dodane_litery( s2, s1.length() ); // "wyciągasz" nadmiarowe litery z drugiego wyrazu do tymczasowego stringa
    std::cout << "Pierwszy: " << s1 << "\n";
    std::cout << "Drugi: " << s2 << "\n";
    std::cout << "Dodane litery: " << dodane_litery << "\n";
  }
}
0
tajny_agent napisał(a):

Ok.

if ( s2.length() > s1.length() ) {  //drugi wyraz musi być dłuższy od pierwszego
  bool identyczne = true;
  for( int i = 0; i < s1.length(); ++i ) {  // iterujesz od 0..długość pierwszego wyrazu i sprawdzasz czy litery są identyczne
    if ( s1[ i ] != s2[ i ] ) {  // jeśli litery są różne to dalsze sprawdzanie nie ma sensu
      identyczne = false;
      break;
    }
  }
  // jeśli wszystko jest ok
  if( identyczne ) {
    std::string dodane_litery( s2, s1.length() ); // "wyciągasz" nadmiarowe litery z drugiego wyrazu do tymczasowego stringa
    std::cout << "Pierwszy: " << s1 << "\n";
    std::cout << "Drugi: " << s2 << "\n";
    std::cout << "Dodane litery: " << dodane_litery << "\n";
  }
}

Dziękuję za taką szczegółową pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1