user2779581
user2779581

Reputation: 169

Searching the last character of a string for punctuation

I'm currently working on making a little word processor and I've come across an issue. I'm trying to make the program so that when you press enter, the program will put a full stop on your input and then a space (I'll sort out paragraphs later). The issue is that I can't get the program to search the last character for punctuation and then branch on the result. The compiler gives me the following error: ISO C++ forbids comparison between pointer and integer. The code I currently have is:

#include <fstream>
#include <string> 
#include <iostream>
#include <cstring>
#include <limits>
using namespace std ;

int main() 
{
int i = 0;
string text ;
string text2 ;
string title ;
string usertitle ;
string filelocation = "C:/Users/" ;
string user ;
string punctuation = ". : ! ? "

cout << "Input a title for your file: " ;
getline(cin , title) ;
title.insert(title.length() , ".txt" ) ;
cout << "Your title is: " << title << endl ;
cout << endl << "Input the username associated with your computer: " ;
getline(cin , user) ;
filelocation.append( user ) ;
filelocation.append("/Documents/") ;
filelocation.append(title) ;
cout << "Your chosen file name and location is: " << filelocation << endl ;
for ( i = 1 ; i > 0 ; i++ )
{
    if (text == "") 
    {
        cout << "There are a few instructions that you need to follow in order to use this system effectively: " << endl ;
        cout << "The first being that if you want to use it, you actually have to use a directory that exists. " << endl ;
        cout << "The second being that when you want to exit the program you press enter with nothing typed" << endl ;
        cout << "The third being NOT TO USE FULL STOPS, THE PROGRAM WILL PUT THEM IN FOR YOU" << endl ;
        cout << "Please begin writing: " << endl ;
        getline(cin,text) ;
    } 
    if (text!="")
    {
        text2.append(text) ; //<===HERE IS WHERE I AM HAVING TROUBLE
        if ((text.at(text.size() -1 ) != "!" ) && (text.at(text.size() -1 ) != "?") && (text.at(text.size() -1 ) != ":" )) 
        {
            text2.append(". ") ;
            getline(cin, text) ;
        }
        else
        {
            getline(cin, text) ;
        }
        if (text == "") 
        {
            cout << "End of session" << endl ; break ;
        }
    }
}

ofstream writer( filelocation.c_str() ) ;
if(! writer) 
{
    cout << "Error opening file for output: " << strerror(errno) << endl ;
    return -1 ;
}
else 
{
    writer << text2 << endl ;
    writer.close() ;
}

return 0 ;
}

Thanks for your help in advance!

Upvotes: 0

Views: 814

Answers (3)

Zac Howland
Zac Howland

Reputation: 15872

if ((text.at(text.size() -1 ) != "!" ) && (text.at(text.size() -1 ) != "?") && (text.at(text.size() -1 ) != ":" )) 

That is both inefficient and is not doing what you think. text.at(text.size() -1 ) returns the last character. To get what you want:

char lastChar = text[text.size() - 1]; // or char lastChar = *text.rbegin();
if (!(lastChar == '.' || lastChar == '?' || lastChar == '!')) // note the single quotes
{
    text2.append(".  ");        
}

getline(cin, text);

Upvotes: 1

sehe
sehe

Reputation: 393114

You can't compare "!" and '!'.

I suggest using rbegin() to address the last character:

        text2.append(text.begin(), text.end());
        switch(*text.rbegin())
        {
            case '!': 
            case '?': 
            case ':': text2.append(". "); break;
        }
        getline(cin, text);

        if(text.empty())
        {
            cout << "End of session" << endl;
            break;
        }

Upvotes: 1

Karoly Horvath
Karoly Horvath

Reputation: 96266

"!" is a string, you want to compare against a character: '!'.

Upvotes: 4

Related Questions