开发者

In C++, I thought you could do "string times 2" = stringstring?

I'm trying to figure out how to print a string several times. I'm getting errors. I just tried the line:

cout<<"This is a string.  "*2;

I expected the output: "This is a string. This is a string.", but I didn't get that. Is there anything wrong with this line? If not, here's the entire program:

#include <iostream>
using namespace std;


int main()
{
  cout<<"This is a string.  "*2;

  cin.get();
  return 0;
开发者_StackOverflow社区}

My compiler isn't open because I am doing virus scans, so I can't give the error message. But given the relative simplicity of this code for this website, I'm hoping someone will know if I am doing anything wrong by simply looking.

Thank you for your feedback.


If you switch to std::string, you can define this operation yourself:

std::string operator*(std::string const &s, size_t n)
{
    std::string r;  // empty string
    r.reserve(n * s.size());
    for (size_t i=0; i<n; i++)
        r += s;
    return r;
}

If you try

std::cout << (std::string("foo") * 3) << std::endl

you'll find it prints foofoofoo. (But "foo" * 3 is still not permitted.)


There is an operator+() defined for std::string, so that string + string gives stringstring, but there is no operator*().

You could do:

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

int main()
{
  std::string str = "This is a string.  ";
  cout << str+str;

  cin.get();
  return 0;
}


As the other answers pointed there's no multiplication operation defined for strings in C++ regardless of their 'flavor' (char arrays or std::string). So you're left with implementing it yourself.
One of the simplest solutions available is to use the std::fill_n algorithm:

#include <iostream>  // for std::cout & std::endl
#include <sstream>   // for std::stringstream
#include <algorithm> // for std::fill_n
#include <iterator>  // for std::ostream_iterator

// if you just need to write it to std::cout
std::fill_n( std::ostream_iterator< const char* >( std::cout ), 2, "This is a string.   " );
std::cout << std::endl;

// if you need the result as a std::string (directly) 
// or a const char* (via std::string' c_str())
std::stringstream ss;
std::fill_n( std::ostream_iterator< const char* >( ss ), 2, "This is a string.   " );
std::cout << ss.str();
std::cout << std::endl;


Indeed, your code is wrong.

C++ compilers treat a sequence of characters enclosed in " as a array of characters (which can be multibyte or singlebyte, depending on your compiler and configuration).

So, your code is the same as:

char str[19] = "This is a string.    ";
cout<<str * 2;

Now, if you check the second line of the above snippet, you'll clearly spot something wrong. Is this code multiplying an array by two? should pop in your mind. What is the definition of multiplying an array by two? None good.

Furthermore, usually when dealing with arrays, C++ compilers treat the array variable as a pointer to the first address of the array. So:

char str[19] = "This is a string.    ";
cout<<0xFF001234 * 2;

Which may or may not compile. If it does, you code will output a number which is the double of the address of your array in memory.


That's not to say you simply can't multiply a string. You can't multiply C++ strings, but you can, with OOP, create your own string that support multiplication. The reason you will need to do that yourself is that even std strings (std::string) doesn't have a definition for multiplication. After all, we could argue that a string multiplication could do different things than your expected behavior.

In fact, if need be, I'd write a member function that duplicated my string, which would have a more friendly name that would inform and reader of its purpose. Using non-standard ways to do a certain thing will ultimately lead to unreadable code.


Well, ideally, you would use a loop to do that in C++. Check for/while/do-while methods.

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int count;
    for (count = 0; count < 5; count++) 
    { 
        //repeating this 5 times
        cout << "This is a string.  ";           
    }

    return 0;
}

Outputs:

This is a string.  This is a string.  This is a string.  This is a string.  This is a string.  


Hey there, I'm not sure that that would compile. (I know that would not be valid in c# without a cast, and even then you still would not receive the desired output.)

Here would be a good example of what you are trying to accomplish. The OP is using a char instead of a string, but will essentially function the same with a string.

Give this a whirl:

Multiply char by integer (c++)


cout<<"This is a string.  "*2;

you want to twice your output. Compiler is machine not a human. It understanding like expression and your expression is wrong and generate an error .

error: invalid operands of types 'const char [20]' and 'int' to binary 'operator*'

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜