Nazwy - porównywanie stringów

2011-09-18 17:28
0
char *func(char *nr_1, string *nr_2){
      nr = (char*) malloc (10000);
      nr2 = (char*) malloc (10000);
      std::cin.getline(nr, 10000);
      std::cin.getline(nr2, 10000);
      if(nr_1 == nr_2)                             //??
            return "Te nazwy są takie same";
}

Proste pytanie, czy da się za pomocą instrukcji if porównać nr_1 i nr_2? Jeśli tak, to gdzie jest error?

Pozostało 580 znaków

2011-09-18 17:30

Porównujesz wskaźniki za pomocą tego ifa. Zastosuj strcmp.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
THX! Właśnie o to mi chodziło :) - czarny020 2011-09-18 17:36

Pozostało 580 znaków

2011-09-18 19:14
0

Nawiązując jeszcze do threada.
Jak wiadomo, przy pomocy stringa można porównywać spore liczby i funkcje strcmp() umożliwia sprawdzenie == tych liczb, natomiast gdybym pierwsza liczba była większa od drugiej czy jest jakiś gotowy algo który to sprawdza?

Pozostało 580 znaków

2011-09-18 19:30
0

Kawałek dokumentacji funkcji strcmp() z serwisu cplusplus.com:

Return Value
Returns an integral value indicating the relationship between the strings:
A zero value indicates that both strings are equal.
A value greater than zero indicates that the first character that does not match has a greater value in str1 than in str2; And a value less than zero indicates the opposite.

Edit:
xrisx słusznie zwrócił mi uwagę, dlatego poprawiam posta. Najpierw proponuję sprawdzać długość stringów w celu identyfikacji, która liczba ma większą wartość, a jeśli są tej samej długości, to porównujemy funkcją strcmp.

edytowany 2x, ostatnio: Mrowa, 2011-09-18 19:44
Pokaż pozostałe 5 komentarzy
funkcja strcmp() nie sprawdzi mi która z liczb jest większa, pomimo faktu że są sobie równe długością. Może e.g. nr_1=10001000000020000000 i nr_2=10002000000020000000, czyli nr_2 - czarny020 2011-09-18 19:53
Która z liczb jest większa: 00001 czy 002? - Wibowit 2011-09-18 20:00
dlatego trzeba wyrównać długość zerami na początku. - xrisx 2011-09-18 20:03
załóżmy, że pierwsza cyfra zawsze nie jest zerem - czarny020 2011-09-18 20:12

Pozostało 580 znaków

2011-09-18 19:53
0

I znowu gdybyś się zainteresował klasą string, to mógłbyś porównywać poprzez operatory '==', '<' i '>'


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)
Pokaż pozostałe 3 komentarze
Huh? Ok, zapomnij o tych operatorach. - Endrju 2011-09-18 20:34
Może jakiś przykład zastosowania tego operatora? - czarny020 2011-09-18 20:45
czarny020, operatory po to wymyślili, żebyś mógł sobie tego używać w naturalny (a nie udziwniony operator<(nr_1, nr_2)) sposób: np. if(nr_1 > nr_2). - Mrowa 2011-09-18 21:16
if(nr_1 > nr_2) w taki sposób nie da się sprawdzić stringów, bo sprawdzałem. - czarny020 2011-09-18 21:25
ja nie piszę o konkretnym przypadku, tylko o ogólnej istocie istnienia operatorów. - Mrowa 2011-09-18 22:41

Pozostało 580 znaków

2011-09-18 20:45
1

funkcja strcmp() nie sprawdzi mi która z liczb jest większa, pomimo faktu że są sobie równe długością. Może e.g. nr_1=10001000000020000000 i nr_2=10002000000020000000, czyli nr_2 - czarny020


#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    char* nr1 = "10001000000020000000";
    char* nr2 = "10002000000020000000";

    if(strlen(nr1) == strlen(nr2)) {
        int cmpresult = strcmp(nr1, nr2);
        if(cmpresult < 0) {
            cout << "Liczba nr1 jest mniejsza od nr2. \n";
        } else if(cmpresult > 0) {
            cout << "Liczba nr1 jest wieksza od nr2. \n";
        } else {
            cout << "Liczby sa sobie rowne. \n";
        }
    }

    return 0;
}

Wynik: Liczba nr1 jest mniejsza od nr2.

Działa dla liczb o tej samej długości. Natomiast faktycznie, sprawdzanie wcześniejsze po długości stringów ssie (Wibowit ma rację, moje niedopatrzenie), bo jeśli będziemy mieć przypadek: nr1 = "000001" a nr2 = "002" to nam ze sprawdzania długości wyjdzie, że liczba nr1 jest dłuższa, więc większa, a to nieprawda. Natomiast pomysł xrisx'a z uzupełnianiem zerami jak najbardziej zadziała w tym przypadku.

edytowany 1x, ostatnio: Mrowa, 2011-09-18 20:47

Pozostało 580 znaków

2011-09-18 22:46
0

A nie możesz tego po prostu wczytać jako liczby?

scanf("%i", &nr);
"Przyjmujemy, że żadna z liczb nie ma więcej niż 1000 cyfr." - nie może ;) - byku_guzio 2011-09-18 22:51

Pozostało 580 znaków

2011-09-18 22:56
2

omg... już to było tu tyle razy wałkowane. Sprawdź co ten Twój algo wypluje dla wejścia 2 >= 10. strcmp jest funkcją która porównuje stringi leksykalnie(alfabetycznie) i można ją tu wykorzystać tylko wtedy, gdy długości tych liczb są TAKIE SAME.


THX! Faktycznie, zapomniałem kilka oczywistych warunków. - czarny020 2011-09-18 23:31

Pozostało 580 znaków

2011-09-20 01:43
1

if(nr_1 == *nr_2)


░█░█░█░█░█░█░█░█░█░█░█░
Nawet jeżeli poprawimy na if(nr_1 == nr_2) to IMO nic to nie da, bo porówna pierwsze znaki a nie stringi - Sarrus 2011-09-20 07:52
przy nr_1 nie ma gwiazdki, a nr_2 ma typ string* - krwq 2011-09-20 10:48
no comment - Sarrus 2011-09-20 11:24
nie wiem o co ci chodzi, porównanie char* z stringiem jest jak najbardziej poprawne - krwq 2011-09-20 11:33

Pozostało 580 znaków

2011-09-20 11:03
0

widze że mnie ktoś zaminusował, a nie sprawdził:

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

const char *func(){
      // tych parametrow i tak nie uzywales, bo je nadpisywales wiec wywalilem je z listy parametrow
      char *nr_1;
      string *nr_2;

      nr_1 = (char*) malloc (10000);
      nr_2 = new string; // malockiem nie przydziela sie pamieci stringowi, bo nie wywola sie konstruktor
      std::cin.getline(nr_1, 10000);
      std::getline(cin,*nr_2); // getline dla stringow wyglada w ten sposob
      bool wynik = (nr_1 == *nr_2);

      free(nr_1); // nie bylo zwalniania pamieci
      delete nr_2; // j.w.
      if (wynik)
            return "Te nazwy sa takie same";
      else
            return "Te nazwy sa rozne";
}

int main()
{
  std::cout << func() << endl;
  std::cout << func() << endl;
  std::cout << func() << endl;
  return 0;
}

wejście:

100
100
100
101
222
333

wyjście:

Te nazwy sa takie same
Te nazwy sa rozne
Te nazwy sa rozne

░█░█░█░█░█░█░█░█░█░█░█░
edytowany 1x, ostatnio: krwq, 2011-09-20 11:04

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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