6
votes

C ++ Concaténate Cordures entraîne des "opérandes non valides de types" Const Char * 'et "Cons-Char"

Je veux concatez deux cordes, mais je reçois une erreur que je ne comprends pas comment surmonter cette erreur.

Y a-t-il un moyen de convertir ce const Char * en Char? Devrais-je utiliser une certaine déséroférience? P> xxx pré>

Cependant, si j'essaie de constituer une chaîne "bas" de cette façon, cela fonctionne: P>

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <iterator>
#include <sstream>

int main(int argc, char* argv[]) {

    ifstream file("file.txt");

    vector<string> mapa;
    string line, top, bottom;

    while(getline(file,line)){
        mapa.push_back(line);
    }

    string tmp;
    for(int i = 0; i < mapa.size(); i++)
    {
        tmp = mapa[i];
        for(int j = 0; j < tmp.size(); j++)
        {
            if(tmp[j] != ' ')
            {
                top += "+---";
                bottom += "| " + tmp[j] + " ";
            } else {

            }
        }
        cout << top << endl;
        cout << bottom << endl;
    }

    return 0;
}


2 commentaires

bas + = "|" + tmp [j] ""; à inférieur + = "|" + TMP [J] + "";


Oh, désolé c'est comme je copié. Non, c'est même quand je le répare.


7 Réponses :


3
votes

semble que votre problème est sur cette ligne:

bottom += std::string("| ") + tmp[j] + " ";


3 commentaires

Désolé, cette erreur est venue alors que je copié le code. Ce n'est pas à cela.


@chris pourriez-vous être plus précis?


@booka, Oups, j'ai oublié des missions d'aller à gauche, de sorte que cela ne fonctionne toujours pas. Vous avez pour convertir le premier ou le deuxième à une chaîne.



0
votes

On dirait que vous manquez A + entre TMP [J] et "". La ligne doit lire xxx


1 commentaires

Désolé, cette erreur est venue alors que je copié le code. Ce n'est pas à cela.



7
votes

ici: xxx

Vous essayez de résumer un char et un pointeur sur char . Cela ne fonctionnera pas (il n'entraînera pas la concaténation du caractère et du littéral à chaîne pointu). Et la même chose est vraie si vous ajoutez un signe + après TMP [j] , car cela sera toujours évalué (des parenthèses supplémentaires ajoutées pour souligner le fait que opérateur + associé à gauche): xxx

Si vous souhaitez tout avoir dans une ligne, il suffit de faire: xxx

Maintenant, l'expression ci-dessus sur le côté droit de l'affectation sera évaluée comme suit: xxx

depuis opérateur + pour un < code> std :: string et a char est défini et renvoie un std :: string , le résultat de l'évaluation de la sous-expression entre parenthèses sera un std :: string , qui est ensuite additionné à la chaîne littéral "" , retourner (à nouveau) un std :: string

Finalement, le résultat de l'expression entière (STD :: String ("|") + TMP [J]) + "" est donné en entrée sur opérateur + = < / code>.


5 commentaires

Les parenthèses supplémentaires ne sont pas nécessaires, car opérateur + est de gauche à droite.


Vrai. Mais je ne pense pas à compter sur l'associativité de l'opérateur afin d'obtenir ce que vous voulez sortir du compilateur est souhaitable, d'autant plus que puisqu'il est clair que l'OP ne voit pas pourquoi c'est important ...


@chris: J'ai ajouté que juste pour clarifier des choses


"Vous essayez de résumer un char et un pointeur à char. Cela ne fonctionnera pas" Oui, cela va ajouter la valeur du caractère au pointeur. Pas ce que vous vouliez mais très légal dans C.


Cela fonctionnera, mais cela ne concatéra pas la chaîne - donc ce n'est pas ce que vous vouliez. Essayez printf ("SuperCalifragilisticepsialidocious supercalifragilisticepxpiCious" + 'a'); pour un exemple tordu.



0
votes

Le problème est

bottom += "| "


0 commentaires

0
votes

Gardez à l'esprit que la compilée évaluera le côté droit de l'instruction EQUALLS, et puis em> utiliser string :: opérateur + = code> sur que em> >.

Ainsi, le compilateur essaie d'évaluer "|" + tmp [j] + "" code>. Ce qu'il voit est une chaîne C, un char et une autre c-string. Il n'y a aucun moyen que le compilateur puisse ajouter ceux-ci dans tout em> de manière qui a du sens pour ce que vous essayez de faire. P>

à la place, vous devez concaténer la pièce par pièce, de sorte que Le compilateur sait à regarder dans String code> pour l'opérateur, qui est surchargé pour concaténer les chaînes ou convertir les chaînes C en cordes C ++ afin que le compilateur sait utiliser des chaînes C ++: P >

bottom += string("| ") + tmp[j] + string(" ");


2 commentaires

Je le ferais avec les instructions de 3 + = pour être claire. Juste ma préférence personnelle.


Merci @robert Je n'ai aucune expérience donc c'est très précieux pour moi.



0
votes
char buffer[5];
sprintf(buffer, "| %c ", tmp[j]);
bottom += buffer;

0 commentaires

0
votes

Parce que vous voulez ajouter un pointeur et un caractère, et une telle opération est illégale. Si vous ne voulez pas le faire en une seule ligne, vous pouvez l'essayer comme ceci:

ficelle bas = ""; bas = bas + "|" + TMP [J] + "";

Cela fonctionnera bien.


0 commentaires