📄 string.c
字号:
// Basic string routines. Not hardware optimized, but not shabby.#include <inc/string.h>intstrlen(const char *s){ int n; for (n = 0; *s != '\0'; s++) n++; return n;}intstrnlen(const char *s, size_t size){ int n; for (n = 0; size > 0 && *s != '\0'; s++, size--) n++; return n;}char *strcpy(char *dst, const char *src){ char *ret; ret = dst; while ((*dst++ = *src++) != '\0') /* do nothing */; return ret;}char *strncpy(char *dst, const char *src, size_t size) { size_t i; char *ret; ret = dst; for (i = 0; i < size; i++) { *dst++ = *src; // If strlen(src) < size, null-pad 'dst' out to 'size' chars if (*src != '\0') src++; } return ret;}size_tstrlcpy(char *dst, const char *src, size_t size){ char *dst_in; dst_in = dst; if (size > 0) { while (--size > 0 && *src != '\0') *dst++ = *src++; *dst = '\0'; } return dst - dst_in;}intstrcmp(const char *p, const char *q){ while (*p && *p == *q) p++, q++; return (int) ((unsigned char) *p - (unsigned char) *q);}intstrncmp(const char *p, const char *q, size_t n){ while (n > 0 && *p && *p == *q) n--, p++, q++; if (n == 0) return 0; else return (int) ((unsigned char) *p - (unsigned char) *q);}// Return a pointer to the first occurrence of 'c' in 's',// or a null pointer if the string has no 'c'.char *strchr(const char *s, char c){ for (; *s; s++) if (*s == c) return (char *) s; return 0;}// Return a pointer to the first occurrence of 'c' in 's',// or a pointer to the string-ending null character if the string has no 'c'.char *strfind(const char *s, char c){ for (; *s; s++) if (*s == c) break; return (char *) s;}void *memset(void *v, int c, size_t n){ char *p; int m; p = v; m = n; while (--m >= 0) *p++ = c; return v;}/* no memcpy - use memmove instead */void *memmove(void *dst, const void *src, size_t n){ const char *s; char *d; s = src; d = dst; if (s < d && s + n > d) { s += n; d += n; while (n-- > 0) *--d = *--s; } else while (n-- > 0) *d++ = *s++; return dst;}/* sigh - gcc emits references to this for structure assignments! *//* it is *not* prototyped in inc/string.h - do not use directly. */void *memcpy(void *dst, void *src, size_t n){ return memmove(dst, src, n);}intmemcmp(const void *v1, const void *v2, size_t n){ const uint8_t *s1 = (const uint8_t *) v1; const uint8_t *s2 = (const uint8_t *) v2; while (n-- > 0) { if (*s1 != *s2) return (int) *s1 - (int) *s2; s1++, s2++; } return 0;}void *memfind(const void *s, int c, size_t n){ const void *ends = (const char *) s + n; for (; s < ends; s++) if (*(const unsigned char *) s == (unsigned char) c) break; return (void *) s;}longstrtol(const char *s, char **endptr, int base){ int neg = 0; long val = 0; // gobble initial whitespace while (*s == ' ' || *s == '\t') s++; // plus/minus sign if (*s == '+') s++; else if (*s == '-') s++, neg = 1; // hex or octal base prefix if ((base == 0 || base == 16) && (s[0] == '0' && s[1] == 'x')) s += 2, base = 16; else if (base == 0 && s[0] == '0') s++, base = 8; else if (base == 0) base = 10; // digits while (1) { int dig; if (*s >= '0' && *s <= '9') dig = *s - '0'; else if (*s >= 'a' && *s <= 'z') dig = *s - 'a' + 10; else if (*s >= 'A' && *s <= 'Z') dig = *s - 'A' + 10; else break; if (dig >= base) break; s++, val = (val * base) + dig; // we don't properly detect overflow! } if (endptr) *endptr = (char *) s; return (neg ? -val : val);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -