Re: SYNTAX AND SEMANTICS
Prof.Stanley wrote:
HELLO ALL I AM TRYING TO PUT UP A PROGRAM THAT DETECTS DOUBLE VOWELS
AFTER RECIEVING AN INPUT STRING; MY MAIN PROBLEM LIES IN THE INPUT CAN
SOMEBODY KINDLY HELP DETECT ANY SYNTAX OR SEMANTIC ERRORS:
HERE IS THE CODE:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
void scanner(char s[]);
void scanner(const char s[]);
bool isVowel(char);
int length(char s[]);
int length(const char s[]);
Const correctness matters.
int main(){
//string sentence;
const int max=4096;
char sentence[max];
cout << "Enter $ to terminate!" <<endl;
do{
cout << "\nEnter the input string: ";
getline(sentence,max);
scanner(sentence);
}while(sentence != "$");
First off, you can't compare two raw strings with the != operator. You
should use std::strcmp:
strcmp(sentence, "$")
or, since you are only interested in the first character:
sentence[0] != '$'
Secondly, you should always check the stream state in a loop. Usually
I'd go with:
while (cin)
{
cout << "blah";
getline(sentence, max);
if (sentence[0] != '$')
scanner(sentence);
}
At least you get the idea.
return 0;
}
void scanner(char s[]){
[260 lines of code snipped]
}
Wow! That function is way longer than it really should be. But before
giving any tips and hints I'm going to hit you with a number of compiler
error and logical errors.
One way to simplify design is to use the standard library facilities.
For example, a simple scanner can be trivially written as:
void scanner(const char s[])
{
vector<char> vstack;
map<string, unsigned int> m;
unsigned int l = strlen(s);
for (unsigned int i = 0; i <= l; ++i)
{
char c = s[i];
if (isVowel(c))
{
vstack.push_back(tolower(c, locale()));
}
else
{
if (buff.size() == 2)
{
vstack.push_back(0);
++m[&vstack[0]];
}
vstack.clear();
}
}
// print out the content of m, left for exercise
}
bool isVowel(char c){
return (c == 'a' || c == 'A' || c == 'e' ||
c == 'E' || c == 'i' || c == 'I' || c == 'o' ||
c == 'O' || c == 'u' || c == 'U') ;
}
This function isn't lengthy but it is made very inflexible. Consider:
static char vowels[] = "aeiouAEIOU";
for (unsigned int i = 0; i < 10; ++i)
if (c == vowels[i]) return true;
return fail;
int length(char s[]){
int i=0;
while(s[i]='\0')
i=i+1;
return i;
}
That's just strlen...why do you reinvent the wheel?