Nazwy - porównywanie stringów

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?

0

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

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?

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.

0

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

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.

0

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

scanf("%i", &nr);
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.

1

if(nr_1 == *nr_2)

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

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