Поиск и изменение повторяющихся букв в слове

#c #string

#c #строка

Вопрос:

Я пытаюсь создать логику, которая проходит через слово и пытается найти, есть ли буквы, которые используются более одного раза. Если буква повторяется, измените ее на «1», если это не так, измените ее на «2». Пример: Radar — 11211, Amazon — 121222, karate — 212122. Конкретная проблема заключается в том, что если я использую for() , каждая буква сравнивается с последней. Также я не понимаю, как я могу проверить последнюю букву, используя for() . Последняя буква всегда равна 2.

Вот мой код:

 #include <iostream>
#include <string>
using namespace std;
int main() 
{  string word;
    char bracket1('1');
    char bracket2('2');  
    cout << "Write your word: ";  
    cin >> word;        
    for (int i = 0; i < word.length();   i)  
    {
        char let1 = word[i];
        char let2 = word[i 1];
            if (let1 == let2)
            { word[i] = bracket1;}
            else 
             { word[i] = bracket2; }
         } cout << word; 
}
 

Пример: тест возвращает 1e22 вместо 1221

Ответ №1:

У вас неопределенное поведение в вашей программе при записи word[i 1]; внутри for цикла. Это потому, что вы выходите за пределы последнего значения i с помощью i 1 .

Одним из возможных способов решения этой проблемы было бы использовать std::map , как показано ниже. В данной программе std::tolower используется, потому что вы хотите, чтобы заглавные и строчные буквы обрабатывались одинаково.

 #include <iostream>
#include <map>
#include <algorithm>


int main()
{
    std::string word;
    std::cout << "Write your word: ";  
    std::getline(std::cin, word);
    
    //print out the word before replacing with 1 and 2 
    std::cout<<"Before transformation: "<<word<<std::endl;
    std::map<char, int> charCount; //this map will keep count of the repeating characters 
    
    //iterate through each character in the input word and populate the map 
    for(char amp;c: word)
    {
        charCount[std::tolower(c)]  ;//increment the value by 1 
    }
    
    //replace the repeating characters by 1 and non-repeating by 2 
    for(char amp;c: word)
    {
        
        if(charCount.at(std::tolower(c)) > 1)
        {
            c = '1';
        }
        else 
        {
            c = '2';
        }
    }
    
    //print out the word after transformation
    std::cout<<"After transformation: "<<word<<std::endl;

    return 0;
}

 

Вывод программы можно увидеть здесь.

Вывод для ввода Amazon :

 Write your word: Amazon
Before transformation: Amazon
After transformation: 121222