Wątek przeniesiony 2015-02-18 13:12 z C/C++ przez ŁF.

Odczyt z pliku i porównanie stringów

0

Witam,

moim zadaniem było napisanie programu, który pobiera z pliku dwa ciągi liczb, oddzielone przecinkiem i zapisuje do zmiennej string, te które występują w obu ciągach. Niestety mój program nie spełnia swojego zadania, a ja nie potrafię zlokalizować błędu. W momencie gdy chcę wyświetlić zawartość zmiennej z powtarzającymi się cyframi, nic się nie pokazuje. Czy wiecie jak sobie z tym poradzić?

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


int main()
{

	fstream plik;
	plik.open("liczby.txt", ios::in | ios::out);
	
	if(plik.good())
	{
		string c1;
		string c2;
		string c3;
		
		getline(plik,c1,',');
		getline(plik,c2);
		
		cout<<c1<<endl;
		cout<<c2<<endl;
		
		for(int i=0; i<c1.length();i++)
		c3[i]==0;
		
		
		for(int j=0; j<c2.length(); j++)
		{
			for(int i=0; i<c1.length(); i++)
			{
		
			if(c1[i]==c2[j])
			c3[i]==c1[i];
			
			}
		}}
		
		
		for(int i=0; i<c3.length(); i++)
		
		if(c3[i>0]) cout<<c3[i]<<endl;
		
	    
	
	return 0;	
}
0

Nie

if (c3[i > 0])

tylko

if (c3[i] > 0)

Swoją drogą Twój algorytm też jest bardzo dziwny, ale pewnie to odkryjesz jak wypiszesz te liczby.

0

Dziękuję za zwrócenie uwagi na ten błąd, jednak jego poprawa nie rozwiązała problemu. Nadal nic się nie wyświetla.
Rzeczywiście, trochę to zamotane :) Pewnie dało się to zrobić prościej i szybciej, ale to jedyne co w tym momencie przyszło mi do głowy.

0
string c3;
....
for(int i=0; i<c1.length();i++)
    c3[i]==0;
  1. == to porównanie, nie przypisanie, tak samo w pętli masz porównanie zamiast przypisania
  2. c3 jest pustym stringiem, gdyby to były przypisania to w najlepszym przypadku program by padł
0

Poprawiłam błędy, jednak program nadal nie chce działać. Dziękuję za Twoje chęci, ale dopiero zaczynam naukę programowania i nadal nie rozumiem w czym tkwi problem.

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


int main()
{

	fstream plik;
	plik.open("liczby.txt", ios::in | ios::out);
	
	if(plik.good())
	{
		string c1;
		string c2;
		string c3;
		
		getline(plik,c1,',');
		getline(plik,c2);
		
		cout<<c1<<endl;
		cout<<c2<<endl;
		
		for(int i=0; i<c1.length();i++)
		c3[i]=0;
		
		
		for(int j=0; j<c2.length(); j++)
		{
			for(int i=0; i<c1.length(); i++)
			{
		
			if(c1[i]==c2[j])
			c3[i]=c1[i];
			
			}
		}
		
		
		for(int i=0; i<c3.length(); i++)
		{
			if(c3[i]>0) cout<<c3[i]<<endl;
		
	    }
		
	}
	
	return 0;	
}
```c
 
1
  1. c3 jest pustym stringiem, gdyby to były przypisania to w najlepszym przypadku program by padł

Dodaj:

c3.resize(c1.size());

po wczytaniu c1

0

Wszystko działa jak należy :) Baaardzo dziękuję za pomoc. Mógłbyś mi jeszcze pokrótce wyjaśnić dlaczego to taka konieczna operacja. Chyba, że już opadły Ci ręce i straciłeś cierpliwość...

2

Jak deklarujesz string w ten sposób

string c3;

to on jest pusty. Czyli operacje

c3[i] = 0;

są niepoprawne i w najlepszym przypadku program powinien się wywalić. Niestety się nie wywalił, więc nawet nie wiesz że był błąd.

c3.resize(c1.size());

zmienia długość stringa c3 na taką samą jak c1, w tym przypadku alokując pamięć. Po tym c[3] = 0 już są poprawne (aczkolwiek zbędne, bo resize() samo wypełnia zerami) bo już masz tę tablicę zaalokowaną.

0

Jeszcze raz dziękuję. Teraz wszystko jest już jasne!

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