C++ 代码未打印第二个字符数组C++;

C++ 代码未打印第二个字符数组C++;,c++,arrays,C++,Arrays,基本上,我的奋斗目标是交换每个字符串的第一个字母并打印它。除了我的代码不会打印B外,其他一切似乎都正常。我意识到我需要将[0]存储到临时变量中,以便在存储到B[0]中之前不会被覆盖。出于某种原因,当我运行代码(在站点编译器中)时,它只会打印“ebcd”。即使我告诉它,它也不会打印B #include <iostream> #include <string> #include <bits/stdc++.h> using namespace std; void

基本上,我的奋斗目标是交换每个字符串的第一个字母并打印它。除了我的代码不会打印B外,其他一切似乎都正常。我意识到我需要将[0]存储到临时变量中,以便在存储到B[0]中之前不会被覆盖。出于某种原因,当我运行代码(在站点编译器中)时,它只会打印“ebcd”。即使我告诉它,它也不会打印B

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

void wordSize(string a, string b){
    int lenA = a.size();
    int lenB = b.size();

    cout << lenA << " " << lenB << endl;
}

void firstLetterSwap(string a, string b){
    int sizeA = a.size();
    int sizeB = b.size();
    char temp;
    char* A = new char[sizeA];
    char* B = new char[sizeB];
    strcpy(A, a.c_str());
    strcpy(B, b.c_str());

    A[0] = temp;
    A[0] = B[0];
    B[0] = temp;

    cout << A << " " << B << endl;
}

int main() {
    string a, b;
    cin >> a; 
    cin >> b;

    wordSize(a, b);
    cout << a + b << endl;
    firstLetterSwap(a, b);

    return 0;
}
#包括
#包括
#包括
使用名称空间std;
无效字号(字符串a、字符串b){
int lenA=a.size();
int lenB=b.size();

cout您可以使用
std::swap
from


您必须通过引用传递字符串,否则调用者将看不到更改。至于交换,有一个函数用于此

void firstLetterSwap( std::string& a, std::string& b){
    std::swap(a[0], b[0];
    // and that's all, folks
}

我在您的
firstLetterSwap
实现中发现以下问题

  • 您是按值获取参数的。无论您在函数中对参数做了什么,调用函数中的变量都不会受到影响。如果希望对函数中变量所做的更改在调用函数中可见,则需要通过引用传递它们

  • 您没有对函数中的参数进行任何更改。您正在复制输入参数并对副本进行更改

  • 在调用
    strcpy
    std::string::size
    之前,没有为
    A
    B
    分配足够的空间。因此,
    new char[sizeA]
    将分配内存,该内存可以容纳比您需要的少一个字符。因此,您的程序具有未定义的行为

  • 动态分配的内存未解除分配。对
    new
    /
    new[]
    的每次调用都应伴随相应的
    delete
    /
    delete[]


  • 最简单的修复方法是使用:

    void firstLetterSwap(std::string& a, std::string& b)
    {
        std::swap(a[0], b[0];
    }
    

    #include
    -不要这样做,它不聪明,也不可移植。为什么你觉得需要混合使用C样式字符串和std::string,或者显式地动态分配任何内容?支持@NeilButterworth注释的信息。
    firstLetterSwap
    中的所有代码都是不必要的。你需要的是
    std::swap(a[ 0 ],b(0)];<代码> < <代码> < <代码> >要求<代码>删除>代码>。所以不要使用<代码>新< /C> >,并且不能忘记“删除”。我强烈建议您继续阅读一些C或C++基础书籍,最好是C。
    
    void firstLetterSwap( std::string& a, std::string& b){
        std::swap(a[0], b[0];
        // and that's all, folks
    }
    
    void firstLetterSwap(std::string& a, std::string& b)
    {
        std::swap(a[0], b[0];
    }