#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