【问题标题】:concatenation of 2 char arrays using strcat使用 strcat 连接 2 个字符数组
【发布时间】:2017-10-03 06:50:22
【问题描述】:

如何在 C++ 中连接到 char*? 我尝试使用 strcat 但这仅适用于 char* 和字符串。 strcpy 没有提供所需的输出,因为我相信它会从第二个数组中覆盖第一个数组中的值。 我需要在 C++ 中做这样的事情 (这是我在 java 中所做的)

seat=seat+tempGuest.toString()+". " //Java

strcat_s(p, 150,seating[i][j].toString());

这会产生错误,因为seating[i][j].tostring() 返回一个 char* 类型。

这是我的功能代码

char* Auditorium::toString(){


    char* p = new char[150];
    cout << "The current seating is\n";
    cout << "-------------------------\n";
    for (int i = 0; i < rowNum1; i++)
    {
        for (int j = 0; j < columnNum1; j++)
        {

            strcat_s(p, 150,seating[i][j].toString());
            strcat_s(p, 150," ");


        }
        strcat_s(p, 150,"\n");

    }
    return p;

}

seating[i][j].toString() 正在从以下函数中获取价值

char* Guest::toString()
{

    char * p = new char[30];

    p[0] = firstName[0];
    p[1] = '.';
    p[2]=lastName[0];
    p[3] = '.';
    p[4] = '\0';
        return p;
}

【问题讨论】:

  • 你不能简单地取消引用seating[i][j](和p)吗?
  • edit您的问题并添加所有变量的声明。为什么你使用原始的char 指针?在 C++ 中,您应该使用std::string。另请阅读:minimal reproducible example.
  • 这会产生错误,因为 seat[i][j].tostring() 返回 char* 类型。 哪个错误? edit您的问题并粘贴逐字错误消息。
  • 我需要返回一个 char* 值,所以创建一个新的 char* 来存储返回值似乎很合适
  • 你走错了路。当您使用std::string 时,C++ 会自动管理分配和取消分配,但您必须始终在使用new[] 分配的任何数组上调用delete[] 以避免内存泄漏。如果您是初学者,请帮自己一个忙并坚持使用std::string,如果您想出于学习目的深入了解原始分配,请构建简化的minimal reproducible example,以便我们帮助您修复错误。

标签: c++


【解决方案1】:

在 C++ 中,您使用 std::string。在这种情况下,您甚至可以使用字符串流:

#include <sstream>

std::string Auditorium::toString() {

    std::ostringstream oss;
    oss << "The current seating is\n";
    oss << "-------------------------\n";
    for (int i = 0; i < rowNum1; i++) {
        for (int j = 0; j < columnNum1; j++) {
            oss << seating[i][j].toString();
        }
        oss << "\n";
    }
    return oss.str();
}

没有流,考虑:

std::string Auditorium::toString() {

    std::string result;
    for (int i = 0; i < rowNum1; i++) {
        for (int j = 0; j < columnNum1; j++) {
            result += seating[i][j].toString();
            result += ' ';
        }
        result += '\n';
    }
    return result;
}

奖金

更多 C++ 风格,不要提供toString,而是提供operator&lt;&lt;

Live On Coliru

#include <ostream>
#include <string>
#include <array>

struct Guest {
    std::string firstName, lastName;

    friend std::ostream& operator<<(std::ostream& os, Guest const& g) {
        return os << g.firstName[0] << '.' << g.lastName[0] << '.';
    }
};

namespace {
    using Row = std::array<Guest, 12>;

    inline std::ostream& operator<<(std::ostream& os, Row const& row) {
        for (Guest const& guest : row)
            os << guest << " ";
        return os;
    }
}

struct Auditorium {
    std::array<Row, 10> seating;

    friend std::ostream& operator<<(std::ostream& os, Auditorium const& auditorium) {

        for (Row const& row : auditorium.seating)
            os << row << "\n";

        return os;
    }
};

#include <iostream>

int main() {
    Auditorium auditorium {
        Row {Guest {"Jacob","Lettsom"}, {"Brion","Peasee"}, {"Kelvin","Tomasoni"}, {"Marabel","Fere"}, {"Hertha","Bartlam"}, {"Devondra","Grahl"}, {"Ike","Annott"}, {"Patrick","Cheyenne"}, {"Eada","Dawe"}, {"Marget","Glashby"}, {"Henderson","Glaum"}, {"Cassie","Winsom"}},
        Row {Guest {"Pierson","Kitchen"}, {"Elisha","Pass"}, {"Shirline","Wigin"}, {"Lucas","Stanmore"}, {"Norri","Hitzschke"}, {"Mercedes","Blackboro"}, {"Nappie","Breche"}, {"Freda","Mitton"}, {"Neils","Adamou"}, {"Mack","Rannells"}, {"Gaspard","Christoffersen"}, {"Sherwin","Kenwell"}},
        Row {Guest {"Wallas","Chellam"}, {"Doralin","Corthes"}, {"Sebastien","Scoble"}, {"Domini","Sprott"}, {"Lazaro","Bunton"}, {"Hinda","Korn"}, {"Renata","Vogt"}, {"Delmar","MacDwyer"}, {"Violette","Villiers"}, {"Nicko","McDirmid"}, {"Susanetta","MacCaughey"}, {"Hillary","McNuff"}},
        Row {Guest {"Alex","Downie"}, {"Caro","Westrey"}, {"Burr","Kalkofer"}, {"Ruy","Shelmerdine"}, {"Winfield","Beri"}, {"Isacco","Ellwell"}, {"Gideon","Beaford"}, {"Simon","Blaylock"}, {"Willy","Kloser"}, {"Guillemette","Boult"}, {"Mariya","Oehme"}, {"Emory","Angless"}},
        Row {Guest {"Jammie","Klimek"}, {"Monro","Passman"}, {"Page","Kornes"}, {"Giorgio","Couttes"}, {"Alexine","Glayzer"}, {"Jeni","Ferschke"}, {"Rock","Farrants"}, {"Katrinka","Schnieder"}, {"Irina","Ault"}, {"Antonetta","Griss"}, {"Pammy","Bertenshaw"}, {"Erinna","Terbeck"}},
        Row {Guest {"Evania","Sympson"}, {"Randy","Colvin"}, {"Legra","Osinin"}, {"Michaeline","Moroney"}, {"Adiana","Westbrook"}, {"Kellsie","Smeeton"}, {"Rodrick","Russ"}, {"Winny","Eggleston"}, {"Odille","Jerosch"}, {"Stacee","Liepina"}, {"Lucila","Jedras"}, {"Selma","Perch"}},
        Row {Guest {"Lynda","Palmar"}, {"Gracie","Jennick"}, {"Cleveland","Mordue"}, {"Elias","Manssuer"}, {"Kimbra","Cicchitello"}, {"Genni","Woliter"}, {"Gale","Baudassi"}, {"Johann","Swindlehurst"}, {"Andrei","De" "Laspee"}, {"Edythe","Dorr"}, {"Janela","Fydo"}, {"Silvia","Suerz"}},
        Row {Guest {"Rachel","Shoutt"}, {"Germain","Strangward"}, {"Margot","Son"}, {"Electra","Wookey"}, {"Samuel","Tight"}, {"Brande","Cable"}, {"Ford","Aitken"}, {"Noll","Woolf"}, {"Jourdan","Morewood"}, {"Milo","Trimming"}, {"Adair","Peck"}, {"Darnall","Loftus"}},
        Row {Guest {"Dene","Creer"}, {"Leena","Autry"}, {"Dickie","Wiggington"}, {"Josephine","Eagan"}, {"Hetty","Yoodall"}, {"Gayla","Dibson"}, {"Elwood","Torri"}, {"Eunice","Scapelhorn"}, {"Everett","Bedingfield"}, {"Ralf","Lodeke"}, {"Steve","Dockreay"}, {"Rod","Bruford"}},
        Row {Guest {"Siouxie","Rayment"}, {"Sheila-kathryn","Neal"}, {"Land","Beggi"}, {"Carson","Ferriman"}, {"Aile","Nias"}, {"Paige","Juckes"}, {"Cazzie","Leadstone"}, {"Selinda","Parlet"}, {"Rayner","Kesby"}, {"Murvyn","Laming"}, {"Lorianna","Pardey"}, {"Joane","Sneesby"}},
    };

    std::cout << auditorium << "\n";
}

打印

J.L. B.P. K.T. M.F. H.B. D.G. I.A. P.C. E.D. M.G. H.G. C.W. 
P.K. E.P. S.W. L.S. N.H. M.B. N.B. F.M. N.A. M.R. G.C. S.K. 
W.C. D.C. S.S. D.S. L.B. H.K. R.V. D.M. V.V. N.M. S.M. H.M. 
A.D. C.W. B.K. R.S. W.B. I.E. G.B. S.B. W.K. G.B. M.O. E.A. 
J.K. M.P. P.K. G.C. A.G. J.F. R.F. K.S. I.A. A.G. P.B. E.T. 
E.S. R.C. L.O. M.M. A.W. K.S. R.R. W.E. O.J. S.L. L.J. S.P. 
L.P. G.J. C.M. E.M. K.C. G.W. G.B. J.S. A.D. E.D. J.F. S.S. 
R.S. G.S. M.S. E.W. S.T. B.C. F.A. N.W. J.M. M.T. A.P. D.L. 
D.C. L.A. D.W. J.E. H.Y. G.D. E.T. E.S. E.B. R.L. S.D. R.B. 
S.R. S.N. L.B. C.F. A.N. P.J. C.L. S.P. R.K. M.L. L.P. J.S. 

【讨论】:

  • @sp2danny 哎呀 :)
  • 为什么&lt;iostream&gt; include 出现在main() 之前?
  • @vasek 它提供了std::cout
  • @sehe 当然,但为什么它不在文件的开头?
  • @vasek 没有特别的原因。我喜欢这种方式,因为它向人们展示了您可以在没有iostream 的情况下重载运算符。请参阅此处的基本原理:isocpp.org/wiki/faq/coding-standards#declare-near-first-use(相关逻辑)我已经修复了一些标题(在上一个示例中没有使用 stringstream)。
【解决方案2】:

根据sehe's 的回答,使用std::string 是更好的选择。

但是,如果您想输入new,我想补充一下 在 C++ 中,你做错了。错误的方法是把鸟毛粘在 火箭,或将马蹄铁放在汽车上。 C++ 是围绕这个想法构建的 确定性破坏,所以如果你想'grok' C++,首先 业务顺序正在切换到价值语义和RAII

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多