printf/scanf i string

0

Chcialbym wczytac 5 stringow, sprawdzic, czy są anagramami i jesli tak - wyrzucic je na wyjscie.

 #include <string>
#include <stdio.h>

using namespace std;
bool sprs(string a, string b, string c, string d, string e)
{
	if(a.size()==b.size()&&a.size()==c.size()&&a.size()==d.size()&&a.size()==e.size()) return 1;
}
void sort(string a)
{
	for (int i = 0; i<a.size()-1; i++) if (a[i]>a[i+1]) swap(a[i], a[i+1]);
}
int main(int argc, char *argv[])
{	
	string a,b,c,d,e;
	scanf("%s %s %s %s %s",a.c_str(), b.c_str(), c.c_str(), d.c_str(), e.c_str());
	if(sprs(a, b, c, d, e))
	{
		sort(a);
		sort(b);
		sort(c);
		sort(d);
		sort(e);
		if(a==b&&a==c&&c==d&&a==e) printf("%s %s %s %s %s\n",a.c_str(),b.c_str(),c.c_str(),d.c_str(),e.c_str());
		
	}
	return 0;
}

Program sie kompiluje, jednak po uruchomieniu i wprwadzeniu danych:
Process exited with return value 3221225477
Press any key to continue . . .

1
  1. NIE WOLNO tak wczytywać do stringa! c_str() jest tylko do odczytu! Tylko do zakończenia aktualnego wywołania masz pewność że ten wskaźnik na coś sensownego pokazuje!
  2. Twoje "sortowanie" to jest jedna pętla z bubblesorta, drugą koza zjadła?. Jak nie umiesz napisać sortowania to używaj sort() z <algorithm>
  3. Ja bym ten problem rozwiązał inaczej -> wrzucił literki z każdego słowa do <set> i porównał te sety.
0

wiem, ze nie dziala. jeszcze nie skonczylem tego. nie jest potrzebne?

0
bool sprs(string a, string b, string c, string d, string e)
{
        if(a.size()==b.size()&&a.size()==c.size()&&a.size()==d.size()&&a.size()==e.size()) return 1;
}

a jeśli nie, to co wtedy?

0

funkcja bool domyslnie wyrzuca wartosc 0.

0
pingwindyktator napisał(a):

funkcja bool domyslnie wyrzuca wartosc 0.

Nie.

1

Możesz zrobić tak jak nie chcesz dodatkowego return'a wstawiać:

bool sprs(string a, string b, string c, string d, string e)
  {
   return a.size()==b.size()&&a.size()==c.size()&&a.size()==d.size()&&a.size()==e.size();
  }
0
string sort(string a)
{
	for(int y=0;y<a.size();y++) for(int i=0;i<a.size()-1;i++) if(a[i]>a[i+1]) swap(a[i], a[i+1]);
	return a;
}

co tutaj jest nie tak?
warning: comparison between signed and unsigned integer expressions

0

zamiast int - size_t lub unsigned

0

wracając do glownego problemu. dlaczego
scanf("%s %s %s %s %s",a, b, c, d, e);
nie działa?
cannot pass objects of non-trivially-copyable type 'std::string {aka struct std::basic_string<char>}' through '...'

0

ponieważ: - "cannot pass objects of non-trivially-copyable type 'std::string {aka struct std::basic_string<char>}'".
dla stringów masz:
cin>>a>>b>>c>>d>>e;

0

mam rozumiec, ze nie da sie wczytac stringa scanfem?

0

Na upartego, da się.

0

@_13th_Dragon możesz rozwinąć? Bo bardzo mnie tym zaciekawiłeś :) Chyba że mówisz o szalonym pomyśle, żeby zarezerwować w stringu odpowiednio dużo miejsca a potem wpisać na jana do wyniku c_str()?
@zonkoo22 scanf() to funkcja z biblioteki języka C i zasadniczo operuje ona na typach z języka C, a std::string tam nie ma.

0

@zonkoo22, jeżeli wam kazano używać scanf to na pewno też zabroniono używać string; zaś jeżeli pozwolono używać string to cin/cout na pewno też pozwolono. Każda inna kombinacja to albo głupota albo podpucha ze strony prowadzącego.

0
Shalom napisał(a):

@_13th_Dragon możesz rozwinąć? Bo bardzo mnie tym zaciekawiłeś :) Chyba że mówisz o szalonym pomyśle, żeby zarezerwować w stringu odpowiednio dużo miejsca a potem wpisać na jana do wyniku c_str()?
Oczywiście to jest tylko głupie dywagowanie nie znajdujące zastosowania w praktyce, ale jeśli by przyjąć, że string trzyma wszystkie znaki obok siebie można by użyć operatora [], będzie znacznie bezpieczniej niż c_str

string napis(10, '\0');
sscanf("%10s", &napis[0]);
napis.erase(strlen(napis.c_str());
0

Zawsze można też użyć cstringa jako buforu i przeładować go do std::string.

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