Hi,

Got another question concerning an array of strings:

I did it this way:

int main()
{	
	const std::string myArray[] = { "January", "February", "March", "April", "May", "June", "July",
		"August", "September", "October", "November", "December"};

	for (size_t i = 0; i < 12; i++)
		std::cout << myArray[i] << '\n';
	std::cout << '\n';

	std::cin.get();

	return 0;
}

but I thought that there was also a way that you could use the beginning and end of the array to loop threw the array like this myArray.begin() and myArray.end() doing something like this:

std::string::iterator itr;

	for (itr = myArray.begin(); itr != myArray.end(); itr++)
		std::cout << *itr << '\n';
	std::cout << '\n';

Problem I have is that I'm using an array of strings, I therefore used the following myArray[0].begin() and myArray[11].end() but that doesn't seem to work.

Could anyone help me out, thank you.

Re: Initializing an array of strings and printing it. 80 80

Well, I found a solution, but I'm not sure this is good, to find the starting point was simple, but, I find to use the end of the array of strings not quiet right. Here's how I did it:

for (std::string *str = myString; str != &myString[12]; str++)
	         std::cout << *str << '\n';
	std::cout << '\n';
Re: Initializing an array of strings and printing it. 80 80

but I thought that there was also a way that you could use the beginning and end of the array to loop threw the array like this .

use vector<string> and you can do what you want using iterators.

Re: Initializing an array of strings and printing it. 80 80

How about something like:

for( const std::string* str = myArray ; str != 0 ; str++ )
        std::cout << *str << '\n';
    std::cout << '\n';
Re: Initializing an array of strings and printing it. 80 80

@ AD,

Thanks AD, but, I thought that begin and end also worked with strings no?


@ s.o.s,
That doesn't work s.o.s, I think it's because strings are not \0 terminated.

Got an additional question gentlemen, there's an exercise that asks the following:

- Find an example where it would make sense to use a name in its own initializer.

I quiete frankly don't understand what is asked here? Do you guys know?

Re: Initializing an array of strings and printing it. 80 80

@ AD,
Thanks AD, but, I thought that begin and end also worked with strings no?

Iterators work only for C++ containers. String, Vector etc. are containers and iterators work well with them. Array is not a C++ container class. You can use iterator to walk through the characters of the string..

@ s.o.s,
That doesn't work s.o.s, I think it's because strings are not \0 terminated.

If you will look closely, I have done "str != 0", here str is a pointer. The above code works perfectly well for me.

Re: Initializing an array of strings and printing it. 80 80

Well s.o.s, using this code:

#include <iostream>
#include <string>

int main()
{	
	std::string myArray[] = { "January", "February", "March", "April", "May", "June", "July",
		"August", "September", "October", "November", "December"};

	for(const std::string* str = myArray ; str != 0; str++ )
                     std::cout << *str << '\n';
                std::cout << '\n';
				
	std::cin.get();

	return 0;
}

It compiles without errors or warnings, but once executed, it goes on and on, doesn't seem to find the end of the array.

Re: Initializing an array of strings and printing it. 80 80

Okay looks like something queer is going on around here. I ran the same program without any modifications and this is what I get:

January
February
March
April
May
June
July
August
September
October
November
December

Press ENTER to continue.
Re: Initializing an array of strings and printing it. 80 80

Well, Ive checked and checked again, the code still gives the same output, it compiles correctly, no errors nor warnings but once executed, it just keeps on going. If I use str != &myString[12] however, it works like a charm.

Guess it's a mistery that won't be resolved. Anyway, thanks for your help guys :!:

Re: Initializing an array of strings and printing it. 80 80

>>for(const std::string* str = myArray ; str != 0; str++ )

Now how can that ever work because myArray is not a nulll-terminated array. You are attempting to apply C-style character array techniques to a c++ string, and won't work.

Re: Initializing an array of strings and printing it. 80 80

I know it was wrong and was going to edit the post but dont know why it works in my case....

Just wanted to make someone double cheked it because it works in my case( dont know how ).

Mr. Dragon, if you have a VS2005, can you please check it out because Jobe has I think got a VC6.

Re: Initializing an array of strings and printing it. 80 80

Mr SOS -- it works up to a point -- gives the famous message box that a fatal error has occured -- similar to core dump in *nix.

Jo: There is a very simple fix to the problem -- check for an empty string

int main()
{	
	std::string myArray[] = { "January", "February", "March", "April", "May", "June", "July",
		"August", "September", "October", "November", "December", ""};

	for(const std::string* str = myArray ; *str != ""; str++ )
                     std::cout << *str << '\n';
                std::cout << '\n';
				
	std::cin.get();

	return 0;
}
Re: Initializing an array of strings and printing it. 80 80

...because Jobe has I think got a VC6.

Hi gentlemen,

@s.o.s,
Ive got VS EE free version.

@ Ancient Dragon,
Thanks AD, I thought there ought to be a cleaner solution then (std::string *str = myString; str != &myString[12]; str++) Also tried to use the vector AD:

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

void print(const std::vector<std::string>);

int main()
{	
	std::vector<std::string> myString;
	
	myString.push_back("January");
	myString.push_back("February");
	myString.push_back("March");
	myString.push_back("April");
	myString.push_back("May");
	myString.push_back("June");
	myString.push_back("July");
	myString.push_back("August");
	myString.push_back("September");
	myString.push_back("October");
	myString.push_back("November");
	myString.push_back("December");

	print(myString);

	std::cin.get();

	return 0;
}

void print(const std::vector<std::string> myArray)
{
	std::vector<std::string>::const_iterator itr;

	for (itr = myArray.begin(); itr != myArray.end(); itr++)
		std::cout << *itr << '\n';
}

Anyway, thank you both gentlemen for the great help :!:

Be a part of the DaniWeb community

We're a friendly, industry-focused community of 1.18 million developers, IT pros, digital marketers, and technology enthusiasts learning and sharing knowledge.