Нахождение самого длинного общего суффикса между двумя строками C ++

0

Я новичок в C++, и я не могу понять это.

При запуске я получаю некоторый странный вывод. Я также пытаюсь сделать это самым простым способом. Как я могу просто напечатать слово в массиве суффиксов, а не весь лишний материал. Я попробовал несколько способов сделать это, и они все еще появляются.

    #include <iostream>
    #include <conio.h>
    #include <string>

    using namespace std;

    int main(){

        char word1[80];
        char word2[80];
        char suffix[80];

        cout << "Enter the first word: ";
        cin >> word1;

        cout << "Enter the first word: ";
        cin >> word1;

        int len1 = strlen(word1);
        int len2 = strlen(word2);

        while(len1 > 0 && len2 > 0 && word1[len1] == word2[len2]) {
            int k=0;
            suffix[k]=word1[len1];  

            k++;
            len1--;
            len2--;
        }



        for(int i=strlen(suffix);i>=0; i--){
            cout << suffix[i];
        }



        getch();
        return 0;
    }
  • 1
    Вы никогда не читаете в word2 , вы просто читаете в word1 дважды. Кроме того, вы вызываете strlen для suffix , но suffix не является строкой. word1 является строкой, потому что cin >> word1; читает в строке, но suffix это просто массив символов. (Подумайте об этом. Как мог strlen знать, что вернуть?)
  • 0
    word2 используется в цикле while, если они одинаковые, тогда действительно не имеет значения, что я использую значения word1. Я также пытался заменить strlen (суффикс) на k после удаления его из while local, но это не сработало. ***** Извините за то, что теперь я понимаю, что вы имели в виду под словом 1, моя ошибка.
Показать ещё 2 комментария
Теги:
arrays
loops

2 ответа

1
Лучший ответ

Несколько вещей:

  • Вам лучше использовать string вместо массива char. Таким образом, вам не нужно беспокоиться о памяти.
  • Линия int k=0; должно быть вне while.
  • Помните, что массивы начинаются с 0, поэтому вычитайте 1 из длины слов и итерации, пока len1 >= 0 && len2 >= 0
  • Используя строки, вы можете использовать метод substr (ссылка здесь).

Вот измененная версия вашего кода:

#include <iostream>
#include <conio.h>
#include <string>
using namespace std;

int main() {
    string word1,word2,suffix;
    cout << "Enter the first word: ";
    cin >> word1;
    cout << "Enter the first word: ";
    cin >> word2;
    int len1 = word1.size()-1;
    int len2 = word2.size()-1;
    int k=0;
    while(len1 >= 0 && len2 >= 0 && word1[len1] == word2[len2]) {
        len1--;
        len2--;
        k++;
    }
    suffix=word1.substr(word1.size()-k,k);
    cout << suffix;
    getch();
    return 0;
}
  • 0
    Я получаю строковый индекс из-за ошибки диапазона в этом коде из раздела суффикса =
  • 0
    @ user2924136 Я не могу повторить эту ошибку. На каком входе вы его получили?
Показать ещё 1 комментарий
1

Я всегда думаю, что "самый простой способ" - это использовать кого-то другого. Вот один из способов написать вашу программу, которая использует стандартную библиотеку:

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

std::string suffix(const std::string& a, const std::string& b) {
    size_t len = std::min(a.size(), b.size());
    auto its = std::mismatch(a.rbegin(), a.rbegin()+len, b.rbegin());
    return std::string(its.first.base(), a.end());

}

int main () {
    std::cout << suffix("December", "May") << "\n";
    std::cout << suffix("January", "February") << "\n";
    std::cout << suffix("April", "April") << "\n";
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню