---
# System prepended metadata

title: 'Chatbot, from Group D (and F) in Lab session 1'

---

# Chatbot, from Group D (and F) in Lab session 1


## You wanna look at the changelogs, look in the top right. 3 Dots, "Version and Github Sync".

###    or not, considering that we have to zip this file up. Eh. Take a link to the hackmd too, if you want to keep using it. Recursion, huzzah.
Main code: https://hackmd.io/6BS1DdrOSWy2lWl0X6Wvnw?both
Wordlist: https://hackmd.io/3AVEajKpTaeDkzTHEimPog?both


``` c
//Libraries go here. Add as you need.
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <ctype.h>

int main()
{
// Taking inspiration from line 6 of https://github.com/hashinclude72/chatbot/blob/master/chatbot.c
char questions[10][10]={"who","what","where","why","how"}; //Priority keywords. If one of these is at the start of the input, react accordingly.
char keywords1[100][20]={"zomgwtf","sky","blue","london","uk",};//Keyword bank that program will compare words in input to. 
int questionLen = sizeof questions / sizeof questions[0];
int keywordsLen = sizeof keywords1 / sizeof keywords1[0]; //get len of both arrays
/*
Branching tree word bank example:
why
    sky
        blue:reasons
what

where
    london:uk
    
Each word in sentence search current branch, if match then enter new branch
Don't know how to do this
*/
/*
Idea for reading tree word bank from file
        
Ignore first star
Read each word looking for match
After first star ignore stuff between stars
/end indicates branch has ended
If match found, start from that point so first star will be ignored, reading into
next branch and ending at /end

*
1a
    *
    2a
    2b
    2c
    /end
    *
1b
1c
    *
    2a
    2b
    /end
    *
/end
*

*/



//Prints opening line and waits for a response.
printf("Hello- what is your name?: ");


char name[20];
fgets(name, sizeof(name), stdin); //Take user's name and store in array 'name'

//COPIED FROM greeting.c
//Takes time from user's clock, responds accordingly

int hour;
time_t t = time(NULL);
    struct tm tm = *localtime(&t);
    hour=tm.tm_hour;
    //* https://stackoverflow.com/a/1442131 *//

    if (hour<12)
    {
        printf("Good morning, %s",name);
    }
    else if (hour<19)
    {
        printf("Good afternoon, %s",name);
    }
    else
    {
        printf("Good evening, %s",name);
    }

//COPIED FROM greeting.c

//FILE* wordbank = fopen("wordbank.txt", "r"); //file containing wordbank tree, not made yet

while (1) {
    //take input
    char input[100]; //Sentences can be long.
    char* userQuestion;
    char* userKeyword;
    fgets(input, sizeof(input), stdin); //get user input
    int len = strlen(input);
    input[strcspn(input, "\n")] = 0; //removes trailing newline
	int j=0;// for loop to remove puncuation
    for(int i=0;i<len;i++){ //https://stackoverflow.com/a/1841811
		if (! ispunct(input[i])){ //if its not punctuation, write it to the string
			input[j]=tolower(input[i]);
			j++;
		}
    }
    //do something
    
    //Goal- Split up inputted line into seperate strings, each made of a word and either whitespace or a special character, as sentences usually end. Or a null byte or something, if they decide to not punctuate.
    
    //Then, parse each word through a function that checks if it recognises the word from a wordbank- once this is completed, try to respond with a relevant response.
    
    //read word
    char* word; //pointer to current word
    const char space[2] = " "; //delimiter character
    word = strtok(input, space); //get first word
    while (word != NULL) { //while there are words left print and get next word
        printf("Word: %s\n", word);
        //TODO check word against wordbank.txt
        //could probably compress this by making it into a function and calling it twice
        //TODO make responses
        for (int bank=0;bank<=questionLen;bank++) //finding question word in user input
        	if (strcmp(word, questions[bank])==0){ //compare word in user input against question word
				userQuestion = questions[bank];	
        		printf("Question: %s\n", userQuestion); //test print the found user question word
                break; //break loop when question word found (could add functionality for multiple question words)
        	}
        for (int i=0;i<=keywordsLen;i++) //as above but for the keyword
        	if (strcmp(word, keywords1[i])==0){ //needs integration with the parsed wordbank.txt
				userKeyword = keywords1[i];
        		printf("Keyword: %s\n", userKeyword); //test print the found user question word
        	}
        word = strtok(NULL, space);
    }
}
//Idea- have the chatbot ask a question and add the answer to wordbank.txt
//Idea- use strstr() [or use strcasestr() which ignores case) that allows for finding substrings within string? Not sure how to use this with an array filled with keywords, but something to think about.
//If you use strcasestr(), put #define _GNU_SOURCE BEFORE ANY #include.



return 0;
}




















//alex wuz 'ere- delete this comment at your own peril
//a second alex has also been here
```