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

时间:2018-04-06 19:13:24

标签: c++ arrays

基本上,我苦苦挣扎的部分的目标是交换每个字符串的第一个字母并打印出来。一切似乎都有效,除了我的代码不会打印B.我意识到我需要将A [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;
}

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您可以使用std::swap

中的<algorithm>
#include <iostream>     //cout
#include <string>
#include <algorithm>    //swap()

using namespace std;

//passing strings by reference to work directly with them
void firstLetterSwap(string &a, string &b){
    swap(a[0], b[0]);
}

int main() {
    string a = "first";
    string b = "second";

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

    return 0;
}

输出:

sirstfecond

答案 2 :(得分:0)

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

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

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

  3. 在致电A之前,您没有为Bstrcpy分配足够的空间。 std::string::size返回一个排除终止空字符的值。因此,new char[sizeA]将分配比您需要的字符少一个的内存。因此,您的程序具有未定义的行为。

  4. 未释放动态分配的内存。每次致new / new []的电话都应附有相应的delete / delete []

  5. 最简单的解决方法是使用:

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