Две строки не равны в c ++ - PullRequest
0 голосов
/ 13 июля 2020

У меня проблема с сопоставлением двух строк из библиотеки std в отмеченной строке кода. После этой строки выводится «NO», хотя строки после сортировки одинаковы и имеют одинаковую длину. При сортировке я использовал пузырьковую сортировку с функцией обмена.

#include <iostream>
#include <algorithm>
#include <string> 

void sort(int n, std::string s);

int main() {
    std::string s1;
    std::string s2; 
 
    std::getline(std::cin, s1);
    std::getline(std::cin, s2);
 
    if (s1.length() != s2.length()) {
        std::cout << "NO";
    } else {
        sort(s1.length(), s1);
        sort(s2.length(), s2);     
        if (s1 == s2) { // <-- !
            std::cout << "YES";
        } else {
            std::cout << "NO";
        }
    }

    return 0;
}
 
void sort(int n, std::string s) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (s[j] > s[j + 1]) {
                std::swap(s[j], s[j + 1]);
            }  
        } 
    }
}

Ответы [ 2 ]

3 голосов
/ 13 июля 2020

Ваша функция sort на самом деле не изменяет передаваемую строку s1. Вам нужно, чтобы s был ссылкой на аргумент, переданный в:

void sort(int n, std::string &s);

и теперь меняющий s аналогично изменению s1.

Вам также необходимо изменить подпись в определении функции.

Кроме того, вам не нужно передавать длину строки в функцию, поскольку строка уже знает свой размер:

void sort(std::string &s) {
   int n = s.length();
   // ...
}
0 голосов
/ 13 июля 2020

Строки передаются по значению. Копии отсортированы, но оригиналы без изменений. Исправление для вашей функции - в другом ответе. Это будет работать.

Альтернативный подход - использовать std :: sort вместо вашей функции сортировки. Он использует итераторы.

#include <iostream>
#include <algorithm>
#include <string> 

int main() {
    std::string s1;
    std::string s2; 
 
    std::getline(std::cin, s1);
    std::getline(std::cin, s2);
 
    if (s1.length() != s2.length()) {
        std::cout << "NO";
    } else {
        std::sort(s1.begin(), s1.end());
        std::sort(s2.begin(), s2.end());     
        if (s1 == s2) { // <-- !
            std::cout << "YES";
        } else {
            std::cout << "NO";
        }
    }

    return 0;
}

Вы также можете изменить свою функцию сортировки, чтобы использовать итераторы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...