Question

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

int main(int argc, char *argv[] )
{
ifstream file;
// check for valid user input
if (argc != 2) 
{
    cout << "Please enter the file name." << endl;
    return 0;
}
else
{
    file.open (argv[1]);
    // check if file is valid
    if (file == 0)
    {
        cout << "File is not valid." << endl;
        return 0;
    }
}

char words[100][16]; // 2d array for unique words
char line[100]; // c-string to hold a line
char *token = NULL;
int h=0; // variable for counting array index 
int i, j; // counter variables

while (file.getline (line, 100, '\n'))
{
    bool unique = true; // boolian to test for unique words
    cout << line << endl; // echo print the line
    token = strtok(line, " ."); // 1st token
    if (token == NULL) // check if 1st token exists
    {
        break;
    }
    // loop to check if token is unique 
    for (i = 0; i < 100; i++)
    {
        if (strcmp(token, words[i]) == 0)
        {
            unique = false;
            break;
        }
    }
    if (unique == true)
    {
        strcpy(words[h], token);
        h++;
    }
    unique = false; 
    // another loop to continue strtok and check for unique words
    while (token != NULL)
    {
        token = strtok(NULL, " .");
        for (i = 0; i < 100; i++)
        {
            if (strcmp(token, words[i]) == 0) 
            {
                unique = false;
                break;
            }
        }
        if (unique == true)
        {
            strcpy(words[h], token);
            h++;
        }
    }
}



return 0;
}

This is my code so far, all my characters should fit the array and the loops appear to be logically sound. I don't understand why my program compiles but doesn't run correctly. I am guessing that it might have something to do with 2 dimensional arrays and the syntax I chose to use for strcmp and strcpy. But I tried putting words[h][0] instead of words[h] and that doesn't work either. I'm kind of at a complete loss here, please help!

Was it helpful?

Solution

First of all you have to zero-initialize the array

char words[100][16] = {};

This loop

for (i = 0; i < 100; i++)
{
    if (strcmp(token, words[i]) == 0)
    {
        unique = false;
        break;
    }
}

should be changed to

for (i = 0; i < h; i++)
{
    if (strcmp(token, words[i]) == 0)
    {
        unique = false;
        break;
    }
}

This code snippet

while (token != NULL)
{
    token = strtok(NULL, " .");
    // ...

has to be substituted for

while ( ( token = strtok(NULL, " .") ) != NULL)
{
    // ...

I think that it is the main reason of the program crash.

Also you do no check whether there are more unique words in the file than the size of the array and whether the size of a token is greater than the second size of the array.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top