📄 string.c
字号:
#include "test.h"#include <string.h>#include <errno.h>_CONST char *it = "<UNSET>"; /* Routine name for message routines. */int errors = 0;/* Complain if condition is not true. */#define check(thing) checkit(thing, __LINE__)void_DEFUN(checkit,(ok,l), int ok _AND int l ){ newfunc(it); line(l); if (!ok) { printf("string.c:%d %s\n", l, it); ++errors; }}/* Complain if first two args don't strcmp as equal. */#define equal(a, b) funcqual(a,b,__LINE__);void_DEFUN(funcqual,(a,b,l), char *a _AND char *b _AND int l){ newfunc(it); line(l); if (a == NULL && b == NULL) return; if (strcmp(a,b)) { printf("string.c:%d (%s)\n", l, it); }}static char one[50];static char two[50];void test_string(){ /* Test strcmp first because we use it to test other things. */ it = "strcmp"; check(strcmp("", "") == 0); /* Trivial case. */ check(strcmp("a", "a") == 0); /* Identity. */ check(strcmp("abc", "abc") == 0); /* Multicharacter. */ check(strcmp("abc", "abcd") < 0); /* Length mismatches. */ check(strcmp("abcd", "abc") > 0); check(strcmp("abcd", "abce") < 0); /* Honest miscompares. */ check(strcmp("abce", "abcd") > 0); check(strcmp("a\103", "a") > 0); /* Tricky if char signed. */ check(strcmp("a\103", "a\003") > 0); /* Test strcpy next because we need it to set up other tests. */ it = "strcpy"; check(strcpy(one, "abcd") == one); /* Returned value. */ equal(one, "abcd"); /* Basic test. */ (void) strcpy(one, "x"); equal(one, "x"); /* Writeover. */ equal(one+2, "cd"); /* Wrote too much? */ (void) strcpy(two, "hi there"); (void) strcpy(one, two); equal(one, "hi there"); /* Basic test encore. */ equal(two, "hi there"); /* Stomped on source? */ (void) strcpy(one, ""); equal(one, ""); /* Boundary condition. */ /* strcat. */ it = "strcat"; (void) strcpy(one, "ijk"); check(strcat(one, "lmn") == one); /* Returned value. */ equal(one, "ijklmn"); /* Basic test. */ (void) strcpy(one, "x"); (void) strcat(one, "yz"); equal(one, "xyz"); /* Writeover. */ equal(one+4, "mn"); /* Wrote too much? */ (void) strcpy(one, "gh"); (void) strcpy(two, "ef"); (void) strcat(one, two); equal(one, "ghef"); /* Basic test encore. */ equal(two, "ef"); /* Stomped on source? */ (void) strcpy(one, ""); (void) strcat(one, ""); equal(one, ""); /* Boundary conditions. */ (void) strcpy(one, "ab"); (void) strcat(one, ""); equal(one, "ab"); (void) strcpy(one, ""); (void) strcat(one, "cd"); equal(one, "cd"); /* strncat - first test it as strcat, with big counts, then test the count mechanism. */ it = "strncat"; (void) strcpy(one, "ijk"); check(strncat(one, "lmn", 99) == one); /* Returned value. */ equal(one, "ijklmn"); /* Basic test. */ (void) strcpy(one, "x"); (void) strncat(one, "yz", 99); equal(one, "xyz"); /* Writeover. */ equal(one+4, "mn"); /* Wrote too much? */ (void) strcpy(one, "gh"); (void) strcpy(two, "ef"); (void) strncat(one, two, 99); equal(one, "ghef"); /* Basic test encore. */ equal(two, "ef"); /* Stomped on source? */ (void) strcpy(one, ""); (void) strncat(one, "", 99); equal(one, ""); /* Boundary conditions. */ (void) strcpy(one, "ab"); (void) strncat(one, "", 99); equal(one, "ab"); (void) strcpy(one, ""); (void) strncat(one, "cd", 99); equal(one, "cd"); (void) strcpy(one, "ab"); (void) strncat(one, "cdef", 2); equal(one, "abcd"); /* Count-limited. */ (void) strncat(one, "gh", 0); equal(one, "abcd"); /* Zero count. */ (void) strncat(one, "gh", 2); equal(one, "abcdgh"); /* Count _AND length equal. */ it = "strncmp"; /* strncmp - first test as strcmp with big counts";*/ check(strncmp("", "", 99) == 0); /* Trivial case. */ check(strncmp("a", "a", 99) == 0); /* Identity. */ check(strncmp("abc", "abc", 99) == 0); /* Multicharacter. */ check(strncmp("abc", "abcd", 99) < 0); /* Length unequal. */ check(strncmp("abcd", "abc",99) > 0); check(strncmp("abcd", "abce", 99) < 0); /* Honestly unequal. */ check(strncmp("abce", "abcd",99)>0); check(strncmp("abce", "abcd", 3) == 0); /* Count limited. */ check(strncmp("abce", "abc", 3) == 0); /* Count == length. */ check(strncmp("abcd", "abce", 4) < 0); /* Nudging limit. */ check(strncmp("abc", "def", 0) == 0); /* Zero count. */ /* strncpy - testing is a bit different because of odd semantics. */ it = "strncpy"; check(strncpy(one, "abc", 4) == one); /* Returned value. */ equal(one, "abc"); /* Did the copy go right? */ (void) strcpy(one, "abcdefgh"); (void) strncpy(one, "xyz", 2); equal(one, "xycdefgh"); /* Copy cut by count. */ (void) strcpy(one, "abcdefgh"); (void) strncpy(one, "xyz", 3); /* Copy cut just before NUL. */ equal(one, "xyzdefgh"); (void) strcpy(one, "abcdefgh"); (void) strncpy(one, "xyz", 4); /* Copy just includes NUL. */ equal(one, "xyz"); equal(one+4, "efgh"); /* Wrote too much? */ (void) strcpy(one, "abcdefgh"); (void) strncpy(one, "xyz", 5); /* Copy includes padding. */ equal(one, "xyz"); equal(one+4, ""); equal(one+5, "fgh"); (void) strcpy(one, "abc"); (void) strncpy(one, "xyz", 0); /* Zero-length copy. */ equal(one, "abc"); (void) strncpy(one, "", 2); /* Zero-length source. */ equal(one, ""); equal(one+1, ""); equal(one+2, "c"); (void) strcpy(one, "hi there"); (void) strncpy(two, one, 9); equal(two, "hi there"); /* Just paranoia. */ equal(one, "hi there"); /* Stomped on source? */ /* strlen. */ it = "strlen"; check(strlen("") == 0); /* Empty. */ check(strlen("a") == 1); /* Single char. */ check(strlen("abcd") == 4); /* Multiple chars. */ /* strchr. */ it = "strchr"; check(strchr("abcd", 'z') == NULL); /* Not found. */ (void) strcpy(one, "abcd"); check(strchr(one, 'c') == one+2); /* Basic test. */ check(strchr(one, 'd') == one+3); /* End of string. */ check(strchr(one, 'a') == one); /* Beginning. */ check(strchr(one, '\0') == one+4); /* Finding NUL. */ (void) strcpy(one, "ababa"); check(strchr(one, 'b') == one+1); /* Finding first. */ (void) strcpy(one, ""); check(strchr(one, 'b') == NULL); /* Empty string. */ check(strchr(one, '\0') == one); /* NUL in empty string. */ /* index - just like strchr. */ it = "index"; check(index("abcd", 'z') == NULL); /* Not found. */ (void) strcpy(one, "abcd"); check(index(one, 'c') == one+2); /* Basic test. */ check(index(one, 'd') == one+3); /* End of string. */ check(index(one, 'a') == one); /* Beginning. */ check(index(one, '\0') == one+4); /* Finding NUL. */ (void) strcpy(one, "ababa"); check(index(one, 'b') == one+1); /* Finding first. */ (void) strcpy(one, ""); check(index(one, 'b') == NULL); /* Empty string. */ check(index(one, '\0') == one); /* NUL in empty string. */ /* strrchr. */ it = "strrchr"; check(strrchr("abcd", 'z') == NULL); /* Not found. */ (void) strcpy(one, "abcd"); check(strrchr(one, 'c') == one+2); /* Basic test. */ check(strrchr(one, 'd') == one+3); /* End of string. */ check(strrchr(one, 'a') == one); /* Beginning. */ check(strrchr(one, '\0') == one+4); /* Finding NUL. */ (void) strcpy(one, "ababa"); check(strrchr(one, 'b') == one+3); /* Finding last. */ (void) strcpy(one, ""); check(strrchr(one, 'b') == NULL); /* Empty string. */ check(strrchr(one, '\0') == one); /* NUL in empty string. */ /* rindex - just like strrchr. */ it = "rindex"; check(rindex("abcd", 'z') == NULL); /* Not found. */ (void) strcpy(one, "abcd"); check(rindex(one, 'c') == one+2); /* Basic test. */ check(rindex(one, 'd') == one+3); /* End of string. */ check(rindex(one, 'a') == one); /* Beginning. */ check(rindex(one, '\0') == one+4); /* Finding NUL. */ (void) strcpy(one, "ababa"); check(rindex(one, 'b') == one+3); /* Finding last. */ (void) strcpy(one, ""); check(rindex(one, 'b') == NULL); /* Empty string. */ check(rindex(one, '\0') == one); /* NUL in empty string. */ /* strpbrk - somewhat like strchr. */ it = "strpbrk"; check(strpbrk("abcd", "z") == NULL); /* Not found. */ (void) strcpy(one, "abcd"); check(strpbrk(one, "c") == one+2); /* Basic test. */ check(strpbrk(one, "d") == one+3); /* End of string. */ check(strpbrk(one, "a") == one); /* Beginning. */ check(strpbrk(one, "") == NULL); /* Empty search list. */ check(strpbrk(one, "cb") == one+1); /* Multiple search. */ (void) strcpy(one, "abcabdea"); check(strpbrk(one, "b") == one+1); /* Finding first. */ check(strpbrk(one, "cb") == one+1); /* With multiple search. */ check(strpbrk(one, "db") == one+1); /* Another variant. */ (void) strcpy(one, ""); check(strpbrk(one, "bc") == NULL); /* Empty string. */ check(strpbrk(one, "") == NULL); /* Both strings empty. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -