Hey everyone. For starters, this is my first time coding in C++ and I have litte experience in code generally. I made a little code that reads through multiple lines of user input and returns it capitalized. If the word is already all caps, it prints nothing..or it should.
eg:
Input:
This
IS
a
tEst
Output(dsired):
THIS
A
TEST
I am using the following lines of code to determine if the word is caps or not, works fine. Only problem is when the word is ignored, I get a blank line in output like this:
THIS
A
TEST
Any way to avoid this? I hope I didn't overcomplicate this. Thanks in advance
1 2
if (any_of(begin( part ), end( part ), []( char c )
{ return ( islower( c ) ); }))
Something like this, perhaps:
#include <iostream>
#include <string>
#include <cctype>
int main()
{
std::string word ;
while( std::cin >> word ) // for read each word read from stdin till eof
{
std::size_t n_uppercase = 0 ; // count of uper case chars in the word
for( char& c : word ) // for each character in the word
{
// if it is an upper case character, increment cnt of upper case chars
if( std::isupper(c) ) ++n_uppercase ;
// otherwise, convert it to upper case (if it is a lower case character)
else c = std::toupper(c) ;
}
// If the word is already all caps, it prints nothing
// note that a word which contains non-alpha character eg. HELLO! is not considered to be all caps
if( n_uppercase != word.size() ) // if it was not already all caps
std::cout << word << '\n' ; // print out the capitalised word
}
}
#include <iostream>
#include <stdio.h>
#include <ctype.h>
#include <algorithm>
#include <sstream>
usingnamespace std;
int main ()
{
string str;
string line;
while (getline(cin,line)&& line.length()!=0) //put all user inputs in one string until an empty string ("ENTER") is entered
{
str+=line+"\n";
}
istringstream iss(str); //turns string to stream so I can modify each word later
string part;
while (getline(iss,part)) //cut stream into words
{
int i=0;
char c;
if (any_of(begin( part ), end( part ), []( char c ) //check if word is all caps, if not capitalize
{ return ( islower( c ) ); })) //WHAT I NEED: If this is FALSE, do not print a new line
while (part[i-1])
{
c=part[i];
putchar (toupper(c));
i++;
}
if (part.length()==1) //stop program if 1-letter word is read
{
break;
}
cout<<endl;
}
return 0;
}
Except for capitalizing, it must stop if a 1-char-long word is entered, and also take multiple lines of input at once.
#include <iostream>
#include <string>
#include <cctype>
#include <sstream>
// capitalise the word; return true if at least one character
// was converted from lower case to upper case
bool capitalise( std::string& word )
{
bool found_lc_char = false ;
for( char& c : word ) if( std::islower(c) ) // for each lower case character in word
{
found_lc_char = true ; // the word has a lower case character
c = std::toupper(c) ; // convert it to upper case
}
return found_lc_char ; // true if at least one lower case character was present
}
int main()
{
std::string text ; // all text entered by the use
std::string line ;
// for read each line read from stdin till eof
while( std::getline( std::cin, line ) ) text += line + ' ' ; // append to text
std::istringstream stm(text) ;
std::string word ;
// for each word in text, till a single character word is encountered
while( stm >> word && word.size() > 1 )
if( capitalise(word) ) // if at least one character was lower case
std::cout << word << '\n' ; // print it out
}
This is awesome, thank you!
It needs some mini-modifications but I will figure them out.
So, bool is used in order to build a function you can then call in your main? Pretty convenient!
#include <iostream>
#include <string>
#include <cctype>
// capitalise the word; return true if at least one character
// was converted from lower case to upper case
bool capitalise( std::string& word )
{
bool found_lc_char = false ;
for( char& c : word ) if( std::islower(c) ) // for each lower case character in word
{
found_lc_char = true ; // the word has a lower case character
c = std::toupper(c) ; // convert it to upper case
}
return found_lc_char ; // true if at least one lower case character was present
}
int main()
{
std::string result ; // result to be printed out
std::string word ;
// for each word read from stdin, till a single character word is encountered
while( std::cin >> word && word.size() > 1 )
if( capitalise(word) ) // if at least one character was lower case
result += word + '\n' ; // add a the capitalised word to the result
std::cout << result ; // print out the result
}
about your original code, ¿why do you do while (part[i-1])?
in the first iteration you'll be checking part[-1], which is out of bounds
also, you operate on part[i], so the last iteration you are again out of bounds
you also said «it must stop if a 1-char-long word is entered», however in your example output