Почему бесконечный цикл - PullRequest
2 голосов
/ 07 апреля 2020

Я делаю функцию, которая принимает строку в качестве входных данных и сохраняет вхождения букв из az на карте с именем map1. Я понятия не имею, почему вывод выходит за пределы 122 (int ('z')). Я тоже попробовал пока l oop, на всякий случай. Вот код

#include <bits/stdc++.h>
using namespace std;

void makeAnagram(string a) {
    int map1[122][2];
    for(int i='a';i<='z';i++)
        map1[i][1] = 0;
    for(int i=0;i<a.size();i++)
        map1[a[i]][1]++;
    for(int i='a';i<='z';i++)
    {
        cout<<char(i)<<": "<<map1[i][1]<<endl;
    }
}

int main()
{
    string s ="abcwedddf";
    makeAnagram(s);
    return 0;
}

Вывод

a: 1
b: 1
c: 1
d: 3
e: 1
f: 1
g: 0
h: 0
i: 0
j: 0
k: 0
l: 0
m: 0
n: 0
o: 0
p: 0
q: 0
r: 0
s: 0
t: 0
u: 0
v: 0
w: 1
x: 0
y: 0
z: 0
{: 32766
|: 32766
}: 21938
~: 32766
: 0
<and continued>.....

Ошибка времени выполнения: SIGSEGV

Ответы [ 2 ]

3 голосов
/ 07 апреля 2020

Давайте на минутку предположим, что вы рассчитываете на кодировку ASCII.

Вы получаете доступ к map1, используя индекс за пределами границ, когда символ '~'. Целочисленное значение '~' равно 126. Следовательно, ваша программа имеет неопределенное поведение.

Вы можете решить проблему, используя

std::map<char, int> map1;

Если вы хотите убедиться, что она имеет элемент для определенного набора символов, вы можете инициализировать его соответственно.

std::string init_string = "abcdefgh";
for ( char c : init_string )
{
   map1[c] = 0;
}
2 голосов
/ 07 апреля 2020

Если (int)'z' равно 122 (не обязательно так), то в ваших циклах вы получаете доступ к map1[122][1], который является вторым элементом 123-го элемента, но массив содержит только 122x2 элемента. Также есть много элементов в этом массиве, который вы вообще не используете. a не 0, и неясно, для чего второе измерение. Подсчет частот проще всего выполнить с помощью std::map (или unordered_map, если вам не нужна сортировка):

#include <map>
#include <iostream>
using namespace std;

void makeAnagram(string a) {
    std::map<char,unsigned> map1;

    for (auto c : a) map1[c]++;

    for (const auto& e : map1) {
        std::cout << e.first << ": " << e.second << "\n";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...