строка — Преобразование слова в алфавитные значения букв Переполнение стека

Я только начинаю с c ++ и пытаюсь написать программу, которая берет слово и преобразует буквы в целые числа, соответствующие их позиции в алфавите (разделенные точками), например. привет -> 8.5.12.12.15 (надеюсь, я понял это правильно;))

Я написал небольшую программу, но, похоже, она не работает. Если я введу одну букву, то вывод будет правильным, но если я введу несколько букв, произойдет сбой.

Это код:

#include "stdafx.h"#include <iostream>
#include <string>

int convert(std::string* a, int i)
{
int b;
if (a[i] == "a") { b = 1; return b;}
else if (a[i] == "b") { b = 2; return b;}
else if (a[i] == "c") { b = 3; return b;}
else if (a[i] == "d") { b = 4; return b;}
else if (a[i] == "e") { b = 5; return b;}
else if (a[i] == "f") { b = 6; return b;}
else if (a[i] == "g") { b = 7; return b;}
else if (a[i] == "h") { b = 8; return b;}
else if (a[i] == "i") { b = 9; return b;}
else if (a[i] == "j") { b = 10; return b;}
else if (a[i] == "k") { b = 11; return b;}
else if (a[i] == "l") { b = 12; return b;}
else if (a[i] == "m") { b = 13; return b;}
else if (a[i] == "n") { b = 14; return b;}
else if (a[i] == "o") { b = 15; return b;}
else if (a[i] == "p") { b = 16; return b;}
else if (a[i] == "q") { b = 17; return b;}
else if (a[i] == "r") { b = 18; return b;}
else if (a[i] == "s") { b = 19; return b;}
else if (a[i] == "t") { b = 20; return b;}
else if (a[i] == "u") { b = 21; return b;}
else if (a[i] == "v") { b = 22; return b;}
else if (a[i] == "w") { b = 23; return b;}
else if (a[i] == "x") { b = 24; return b;}
else if (a[i] == "y") { b = 25; return b;}
else if (a[i] == "z") { b = 26; return b;}
}

int main()
{
std::string* a = new std::string;
std::string out;
std::cout << "Please enter a word: ";
std::cin >> *a;
int i = 0;
do
{
out += std::to_string(convert(a, i)) + ".";
i++;
} while (i < a->size());
std::cout << "The converted word is: " << out << std::endl;
return 0;
}

Я в недоумении и надеюсь, что вы могли бы помочь мне …

Заранее спасибо,

Кальтур

[править] фиксированный код

0

Решение

Почему вы получаете ошибку

Вы передаете свою строку в качестве указателя. И когда вы используете оператор индексирования, вы не получаете доступ к каждому отдельному символу, вы фактически получаете доступ к одной строке в возможном массиве строк. Указатели можно рассматривать как массив.

Поэтому, когда у вас есть только письмо, условие

a[0] == "a"   // is the same as *a == "a"

на самом деле нормально, потому что вы обращаетесь к первой строке в массиве и сравниваете ее с другой строкой "a",
Но когда вы получаете доступ к следующим индексам, вы попадаете в неопределенное поведение, когда вы получаете доступ к недопустимым позициям в памяти (т. Е. Обращаетесь ко второй строке в массиве, но вы никогда не собирались создавать массив строк).


Что вы должны сделать вместо

Там нет необходимости создавать new строка. Просто пишу:

std::string a; // This is enough

И когда вы передаете свою строку в функцию, передайте ее как константную ссылку, потому что вы только читаете из нее,

int convert( const std::string &s, int i );

Вещи, которые вы могли бы улучшить

for петля более адекватна, чем do while для простой итерации массива / строки.

В вашем convert функция,

int b;
if (a[i] == 'a') { b = 1; return b;}
else if (a[i] == 'b') { b = 2; return b;}
...

Там нет возврата для случая, когда символ не алфавитный.

И вы должны выбрать между возвратом отдельного значения,

if (a[i] == 'a') { return 1;}
else if (a[i] == 'b') { return 2;}
...

Или вернув b в конце,

int b = -1; // Say -1 for a non alphabetical character
if (a[i] == 'a') { b = 1; }
else if (a[i] == 'b') { b = 2; }
...
return b; // Return ONLY at the end

Не делай обоих.

Обратите внимание, что вы пытались сравнить символ со строкой.

a[i] == "a" // In your code this is comparing a string with a string
// But if you pass your string correctly then it would be character-string comparison

Но вы на самом деле хотели сравнить персонажа с персонажем,

a[i] == 'a'

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

1

Другие решения

Другие ответы говорят о том, как вы можете использовать значения ASCII для сокращения кода. Это очень разумное предложение. Вместо определения значений для каждой буквы вы можете вычесть значение a - 1 от каждого персонажа.

Тем не менее, ваш запрос о том, почему ваш код не работает. Основная проблема заключается в том, что вы сравниваете char с string, Чтобы уточнить, есть разница в "b" а также 'b', Когда вы обращаетесь к индексу строки, возвращаемое значение является символом, тогда как ваш if условия сверяются с stringблагодаря использованию " вместо ', Исправление должно заставить ваш код работать. Ваш код также имеет проблему, что если символ в индексе i не соответствует ни одному из ваших условий if, ваш код ничего не вернет. Вы должны посмотреть на исправление этого также. Если бы я написал этот код, я сделал бы это следующим образом:

int convert(std::string &a, int i)
{
return (a[i] - 'a' + 1);
}

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

1

По вопросам рекламы [email protected]