#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main () {
string vet[10], aux;
std::vector<char> name;
int count=0, sum=0;
while (count<10) {
getline(cin, aux);
for (int i=0; i<aux.length(); i++) name.push_back(aux[i]);
for (int i=0; i<name.size(); i++) {
name[i] = tolower(name[i]); //para garantir que todos os caracteres estão em minúsculo
if (name[i] > 96 && name[i] < 123 && name[i] == 32) //faixa de decimais das letras minúsculas e espaço em caso de nome composto
sum += name[i];
}
char v[name.size()]; //vetor auxiliar criado para realizar a conversão de vetor de char para string
for (int i=0; i<name.size(); i++) {
v[i] = name[i];
}
while (vet[sum%10] != "\0") //para evitar colisão
sum++;
vet[sum%10] = (string) v; //conversão para string e => K mod m = K % m em C++
cout << vet[sum%10] << endl;
count++;
sum = 0;
for (int i=0; i<name.size(); i++) v[i] = '\0';
name.clear();
}
cout << endl;
for (int i=0; i<10; i++) cout << vet[i] << endl;
return 0;
}
Этот код использует концепцию хеширования для хранения имен внутри массива.
Мой вопрос:
Каждый раз, когда я пытаюсь вставить имя из 8, 16 или 24 символов,
при преобразовании массива char в строку компилятор всегда
еще 3 персонажа перед ними. Если я попробую имя с 9, 17 или
25 символов, компилятор всегда помещает еще 2 символа перед
из них. И если я попробую имя из 10, 18 или 26 символов,
Компилятор всегда ставит перед ними другой символ.Почему это происходит? Есть ли способ предотвратить это?
Мне нужно, чтобы все имена были точно (но в нижнем регистре), как они были вставлены на вход, но отсортированы в соответствии с логикой хеширования
Заранее спасибо!
Проблема здесь:
char v[name.size()];
Как было указано, это не стандартный C ++ …
В любом случае, вы можете исправить это так:
std::string v;
v.resize(name.size());
Более или менее он имеет тот же эффект, что и ваш массив символов, за исключением того, что он не использует массив символов.
Других решений пока нет …