Converting char vector to string - C++

Asked

Viewed 4,109 times

0

#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;
}

This code is using the concept of Hashing to store names within a vector.

My question is:

Whenever I try to enter a name with 8, 16 or 24 characters, convert from a character array to a string, the compiler always puts another 3 characters in front of the name. If I try insert a name with 9, 17 or 25 characters, the compiler always puts other 2 characters in front of the name. If I try to enter a name with 10, 18 or 26 characters, the compiler always puts another character in front of the name.

Why does this happen? Is there any way to prevent this?

I need the names to be exactly (but in lowercase) as they were entered in the input, but organized according to Hashing logic.

I already debugged the code and saw that the problem is in converting the character vector to string, but I still haven’t found a better way to do this.

vet[sum%10] = (string) v;

Thank you in advance!

1 answer

2


1) Why don’t you make name a direct char vector since you convert it to it later? Also no need to copy beyond 10 positions, since you will ignore.

   char name[10];

2) You limit your name in the vet string to 10 positions, but try to copy names with more characters, returning to the beginning. You look like characters that were truncated showing up at the beginning.

As you comment that you have already debugged, I imagine that v[i] is with the correct string because you are not doing this truncation logic.

A better way to do this would be, after converting name to a char vector:

  snprintf(name, 10, "%s", aux.data());
  std::string buffAsStdStr = name;
  • Actually, the problem was when creating the vector v[name.size()]. I’ll take a look at your suggestions for improving the code. Thank you very much for your reply!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.