Home > Blockchain >  std::cout is not printing
std::cout is not printing

Time:01-19

When I print out using std::cout, it doesn't print anything to the terminal:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

std::string multiplystr(std::string string, int mult) {
    for (int i = 1; i < mult; i  )     {
        string = string   string;
    }
    return string;
}

class entry {
public:

    entry(int width) {
        int frameWidth = width;
    }

    int frameWidth;
    std::string framechar = "-";

    std::string frame = multiplystr(framechar, (frameWidth   4));
    std::string justout = frame   '\n';
};

int main() {
    entry x1(15);
    std::string out1 = x1.frame;
    std::cout.flush();
    cout << "out1" << std::endl;
}

However, if I delete everything except the print statement, it prints properly. Do you know why it does this?

I also used std::flush and it does not work.

CodePudding user response:

When I run the program it prints everytime. I do not see the problem, are you actually compiling?

CodePudding user response:

Your code has undefined behavior, so literally anything could happen 1.

In your entry class, the constructor body is assigning its input width value to a local variable named frameWidth which shadows the class member of the same name. As such, the frameWidth member is never initialized.

You are then passing the frameWidth member to the mult parameter of multiplystr() when initializing the frame member. The frame member is initialized before the constructor body begins running, so even if you fixed the constructor body to get rid of the local variable and assign the width value to the frameWidth member correctly, by then it is too late, the damage has already been done.

1: In my test, when I run the code, I get a runtime error before the print statement is reached, because mult ends up being a very large value that causes the loop to blow up available memory.

To fix that, you need to initialize the frameWidth member in the constructor's initialization list instead of the constructor body. The initialization list will initialize frameWidth before the frame member is initialized, and thus before multiplystr() is called.

Try this:

#include <iostream>
#include <vector>
#include <string>

std::string multiplystr(std::string s, int mult) {
    for (int i = 1; i < mult; i  )     {
        s  = s;
    }
    return s;
}

class entry {
public:

    entry(int width) : frameWidth(width) {}

    int frameWidth;
    std::string framechar = "-";

    std::string frame = multiplystr(framechar, (frameWidth   4));
    std::string justout = frame   '\n';
};

int main() {
    entry x1(15);
    std::string out1 = x1.frame;
    std::cout << "out1 = " << out1 << std::endl;
}

Online Demo

CodePudding user response:

what are you trying to do?, what i see is that fixing the last line cout << "out1" << std::endl; with cout << out1 << std::endl; it will print. You are using the out1 variable name as a string.

  • Related