#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#define MAX_LENGTH 100
char* StrStr(const char *str, const char *target);
int main(void) {
char *result, *pointer;
char inputstring[MAX_LENGTH]; // here we define a new char array (string) which will be used for the input.
/**
* fgets is used to read a string until a newline (i.e press return key)
* from stdin and into inputstring with a limit of MAX_LENGTH characters.
* It can be thought of as a way to get input from the user. Instead you
* could set inputstring to a predefined array of characters (in the code).
*/
fgets(inputstring
, MAX_LENGTH
, stdin
); pointer = inputstring; // set pointer to the address of inputstring
while((result = StrStr(pointer, "a!c")) != NULL) { // while "a!c" can be found in the remainder of inputstring
int position = result - inputstring; // get the position (i.e index of the target)
pointer += position+1; // to avoid finding the same target indefinitely add position+1 to the pointer
printf("%d\n", position
); // print the index to stdout (i.e the console) }
}
char* StrStr(const char *str, const char *target) {
if (!*target) return NULL;
char *p1 = (char*)str;
while (*p1) { // is the pointer pointing at a NUL terminator? If isn't do what is inside the while loop
char *p1Begin = p1, *p2 = (char*)target;
/**
* is the pointers p1 and p2 not pointing to a NUL terminator?
* is the pointers also pointing at the equivalent data?
* or is p2 pointing at an exclamation mark?
* If these conditions are true then point to the next character in str and target.
*/
while ((*p1 && *p2 && *p1 == *p2) || *p2 == '!') {
p1++;
p2++;
}
if (!*p2)
return p1Begin;
p1 = p1Begin + 1;
}
return NULL;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgTUFYX0xFTkdUSCAxMDAKCmNoYXIqIFN0clN0cihjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnRhcmdldCk7CgppbnQgbWFpbih2b2lkKSB7CiAgY2hhciAqcmVzdWx0LCAqcG9pbnRlcjsKICBjaGFyIGlucHV0c3RyaW5nW01BWF9MRU5HVEhdOyAvLyBoZXJlIHdlIGRlZmluZSBhIG5ldyBjaGFyIGFycmF5IChzdHJpbmcpIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGlucHV0LgoKICAvKioKICAgKiBmZ2V0cyBpcyB1c2VkIHRvIHJlYWQgYSBzdHJpbmcgdW50aWwgYSBuZXdsaW5lIChpLmUgcHJlc3MgcmV0dXJuIGtleSkKICAgKiBmcm9tIHN0ZGluIGFuZCBpbnRvIGlucHV0c3RyaW5nIHdpdGggYSBsaW1pdCBvZiBNQVhfTEVOR1RIIGNoYXJhY3RlcnMuCiAgICogSXQgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSB3YXkgdG8gZ2V0IGlucHV0IGZyb20gdGhlIHVzZXIuIEluc3RlYWQgeW91CiAgICogY291bGQgc2V0IGlucHV0c3RyaW5nIHRvIGEgcHJlZGVmaW5lZCBhcnJheSBvZiBjaGFyYWN0ZXJzIChpbiB0aGUgY29kZSkuCiAgICovCiAgZmdldHMoaW5wdXRzdHJpbmcsIE1BWF9MRU5HVEgsIHN0ZGluKTsKICBwb2ludGVyID0gaW5wdXRzdHJpbmc7IC8vIHNldCBwb2ludGVyIHRvIHRoZSBhZGRyZXNzIG9mIGlucHV0c3RyaW5nCiAgd2hpbGUoKHJlc3VsdCA9IFN0clN0cihwb2ludGVyLCAiYSFjIikpICE9IE5VTEwpIHsgLy8gd2hpbGUgImEhYyIgY2FuIGJlIGZvdW5kIGluIHRoZSByZW1haW5kZXIgb2YgaW5wdXRzdHJpbmcKICAgIGludCBwb3NpdGlvbiA9IHJlc3VsdCAtIGlucHV0c3RyaW5nOyAvLyBnZXQgdGhlIHBvc2l0aW9uIChpLmUgaW5kZXggb2YgdGhlIHRhcmdldCkKICAgIHBvaW50ZXIgKz0gcG9zaXRpb24rMTsgLy8gdG8gYXZvaWQgZmluZGluZyB0aGUgc2FtZSB0YXJnZXQgaW5kZWZpbml0ZWx5IGFkZCBwb3NpdGlvbisxIHRvIHRoZSBwb2ludGVyCiAgICBwcmludGYoIiVkXG4iLCBwb3NpdGlvbik7IC8vIHByaW50IHRoZSBpbmRleCB0byBzdGRvdXQgKGkuZSB0aGUgY29uc29sZSkKICB9Cn0KCmNoYXIqIFN0clN0cihjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnRhcmdldCkgewogIGlmICghKnRhcmdldCkgcmV0dXJuIE5VTEw7CiAgY2hhciAqcDEgPSAoY2hhciopc3RyOwogIHdoaWxlICgqcDEpIHsgLy8gaXMgdGhlIHBvaW50ZXIgcG9pbnRpbmcgYXQgYSBOVUwgdGVybWluYXRvcj8gSWYgaXNuJ3QgZG8gd2hhdCBpcyBpbnNpZGUgdGhlIHdoaWxlIGxvb3AKICAgIGNoYXIgKnAxQmVnaW4gPSBwMSwgKnAyID0gKGNoYXIqKXRhcmdldDsKICAgIC8qKgogICAgICogaXMgdGhlIHBvaW50ZXJzIHAxIGFuZCBwMiBub3QgcG9pbnRpbmcgdG8gYSBOVUwgdGVybWluYXRvcj8KICAgICAqIGlzIHRoZSBwb2ludGVycyBhbHNvIHBvaW50aW5nIGF0IHRoZSBlcXVpdmFsZW50IGRhdGE/CiAgICAgKiBvciBpcyBwMiBwb2ludGluZyBhdCBhbiBleGNsYW1hdGlvbiBtYXJrPwogICAgICogSWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgdHJ1ZSB0aGVuIHBvaW50IHRvIHRoZSBuZXh0IGNoYXJhY3RlciBpbiBzdHIgYW5kIHRhcmdldC4KICAgICAqLwogICAgd2hpbGUgKCgqcDEgJiYgKnAyICYmICpwMSA9PSAqcDIpIHx8ICpwMiA9PSAnIScpIHsKICAgICAgcDErKzsKICAgICAgcDIrKzsKICAgIH0KICAgIGlmICghKnAyKQogICAgICByZXR1cm4gcDFCZWdpbjsKICAgIHAxID0gcDFCZWdpbiArIDE7CiAgfQogIHJldHVybiBOVUxMOwp9Cg==