101 lines
3.7 KiB
C
101 lines
3.7 KiB
C
#include <assert.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
char teststr[2000], substr[200];
|
|
|
|
int main(void)
|
|
{
|
|
// Test strstr with basic functionality
|
|
assert(strcmp(strstr("hello world", "hello"), "hello world") == 0);
|
|
assert(strcmp(strstr("hello world", "world"), "world") == 0);
|
|
assert(strcmp(strstr("hello world", "lo wo"), "lo world") == 0);
|
|
assert(strstr("hello world", "xyz") == nullptr);
|
|
|
|
// Test strstr with empty substring
|
|
assert(strcmp(strstr("hello", ""), "hello") == 0); // empty substring matches at start
|
|
assert(strcmp(strstr("", ""), "") == 0);
|
|
|
|
// Test strstr with substring not found
|
|
assert(strstr("hello", "world") == nullptr);
|
|
assert(strstr("abc", "xyz") == nullptr);
|
|
assert(strstr("short", "longer") == nullptr);
|
|
|
|
// Test strstr with single character substring
|
|
assert(strcmp(strstr("hello", "h"), "hello") == 0);
|
|
assert(strcmp(strstr("hello", "e"), "ello") == 0);
|
|
assert(strcmp(strstr("hello", "o"), "o") == 0);
|
|
assert(strstr("hello", "x") == nullptr);
|
|
|
|
// Test strstr with substring at different positions
|
|
assert(strcmp(strstr("abcdefgh", "abc"), "abcdefgh") == 0); // at start
|
|
assert(strcmp(strstr("abcdefgh", "def"), "defgh") == 0); // in middle
|
|
assert(strcmp(strstr("abcdefgh", "fgh"), "fgh") == 0); // at end
|
|
|
|
// Test strstr with repeated patterns
|
|
assert(strcmp(strstr("ababab", "ab"), "ababab") == 0); // finds first occurrence
|
|
assert(strcmp(strstr("ababab", "ba"), "babab") == 0);
|
|
assert(strcmp(strstr("ababab", "bab"), "babab") == 0);
|
|
|
|
// Test strstr with overlapping patterns
|
|
assert(strcmp(strstr("aaaa", "aa"), "aaaa") == 0); // finds first match
|
|
assert(strcmp(strstr("ababa", "aba"), "ababa") == 0);
|
|
|
|
// Test strstr where substring equals the string
|
|
assert(strcmp(strstr("test", "test"), "test") == 0);
|
|
assert(strcmp(strstr("a", "a"), "a") == 0);
|
|
|
|
// Test strstr with special characters
|
|
assert(strcmp(strstr("hello, world!", "o, w"), "o, world!") == 0);
|
|
assert(strcmp(strstr("a.b.c.d", ".b."), ".b.c.d") == 0);
|
|
assert(strcmp(strstr("x y z", " y "), " y z") == 0);
|
|
|
|
// Build a long test string with pattern
|
|
for(int i = 0; i < 1900; i++)
|
|
{
|
|
teststr[i] = 'a' + (i & 7);
|
|
}
|
|
teststr[1900] = '\0';
|
|
|
|
// Test strstr with long strings
|
|
strcpy(substr, "abcdefgh");
|
|
char *result = strstr(teststr, substr);
|
|
assert(result == teststr); // pattern starts at beginning
|
|
assert(strncmp(result, substr, 8) == 0);
|
|
|
|
// Test strstr with pattern that appears later
|
|
strcpy(substr, "bcdefgha");
|
|
result = strstr(teststr, substr);
|
|
assert(result == teststr + 1); // pattern starts at position 1
|
|
assert(strncmp(result, substr, 8) == 0);
|
|
|
|
// Test strstr with pattern not in string
|
|
strcpy(substr, "zzzzz");
|
|
assert(strstr(teststr, substr) == nullptr);
|
|
|
|
// Test strstr with longer substring than string
|
|
strcpy(teststr, "short");
|
|
strcpy(substr, "this is longer");
|
|
assert(strstr(teststr, substr) == nullptr);
|
|
|
|
// Test strstr with case sensitivity
|
|
assert(strstr("Hello", "hello") == nullptr); // case sensitive
|
|
assert(strcmp(strstr("Hello", "Hello"), "Hello") == 0);
|
|
|
|
// Test strstr with partial matches that fail
|
|
assert(strstr("abcde", "abcx") == nullptr);
|
|
assert(strstr("testing", "tester") == nullptr);
|
|
|
|
// Test strstr with multiple occurrences (finds first)
|
|
strcpy(teststr, "the quick brown fox jumps over the lazy dog");
|
|
assert(strcmp(strstr(teststr, "the"), "the quick brown fox jumps over the lazy dog") == 0);
|
|
assert(strcmp(strstr(teststr, "o"), "own fox jumps over the lazy dog") == 0); // first 'o'
|
|
|
|
// Test strstr with whole word searches
|
|
assert(strcmp(strstr(teststr, "quick"), "quick brown fox jumps over the lazy dog") == 0);
|
|
assert(strcmp(strstr(teststr, "fox"), "fox jumps over the lazy dog") == 0);
|
|
assert(strcmp(strstr(teststr, "dog"), "dog") == 0);
|
|
|
|
return 0;
|
|
}
|