I'm ultimately trying to code a shell, so I need to be able to parse commands. I'm trying to convert every word and special symbol into tokens, while ignoring whitespaces. It works when characters separating tokens are | & < > however as soon as I use a single whitespace character, the program crashes. Why is that?
I'm a student, and I realize the way I came up with separating the tokens is rather crude. My apologies.
#include <iostream>
#include <stdio.h>
#include <string>
#include <cctype>
using namespace std;
#define MAX_TOKENS 10
int main()
{
    //input command for shell
    string str;
    string tokens[MAX_TOKENS] = { "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" };
    int token_index = 0;
    int start_token = 0;
    cout << "Welcome to the Shell: Please enter valid command: " << endl << endl;
    cin >> str;
    for (unsigned int index = 0; index < str.length(); index++)
    {
        //if were at end of the string, store the last token
        if (index == (str.length() - 1)) tokens[token_index++] = str.substr(start_token, index - start_token + 1);
        //if char is a whitespace store the token
        else if (isspace(str.at(index)) && (index - start_token > 0))
        {
            tokens[token_index++] = str.substr(start_token, index - start_token);
            start_token = index + 1;
        }
        //if next char is a special char - store the existing token, and save the special char
        else if (str[index] == '|' || str[index] == '<' || str[index] == '>' || str[index] == '&')
        {
            //stores the token before our special character
            if ((index - start_token != 0)) //this if stops special character from storing twice
            {
                //stores word before Special character
                tokens[token_index++] = str.substr(start_token, index - start_token);
            }
            //stores the current special character
            tokens[token_index++] = str[index];
            if (isspace(str.at(index + 1))) start_token = index + 2;
            else start_token = index + 1;
        }
    }
    cout << endl << "Your tokens are: " << endl;
    for (int i = 0; i < token_index; i++)
    {
        cout << i << " = " << tokens[i] << endl;
    }
    return 0;
}
 
    