📄 rvstr.c
字号:
#include <ctype.h>
#include <string.h>
#include "rvstr.h"
/* Copy source to destination, appending a null character in any case */
char *rvStrNcpyz(char *dst, const char *src, size_t size) {
strncpy(dst, src, size);
dst[size] = '\0';
return dst;
}
/* Perform a case-insensitive comparison */
/* Return 0 if strings are equal, negative if str1 < str2, positive if str1 > str2 */
int rvStrIcmp(const char *str1, const char *str2) {
while (*str1 && *str2) {
int diff = tolower(*str1) - tolower(*str2);
if(diff)
return diff;
str1++;
str2++;
}
return *str1 ? 1 : *str2 ? -1 : 0;
}
/* Convert a string to lowercase in-place */
void rvStrToLower(char* str) {
while (*str) {
*str = tolower(*str);
str++;
}
}
/* Specialized variant of strcpy which returns pointer to the end */
/* of the destination string. This helps speed up copying of */
/* subsequent strings */
char* rvStrCopy(char* d, const char* s) {
while (*s != '\0') *d++ = *s++;
*d = '\0';
return d;
}
/* Modified version of strrev which avoids call to strlen when */
/* the string length is already known */
char* rvStrRevN(char* s, int n) {
int i, j;
char c;
for (i = 0, j = n - 1; i < j; ++i, --j) {
c = s[i];
s[i] = s[j];
s[j] = c;
}
return s;
}
char* rvStrFindFirstNotOf(char* str, char* delimiters) {
for (; *str != '\0' && strchr(delimiters, *str) != NULL; ++str)
;
return str;
}
char* rvStrFindFirstOf(char* str, char* delimiters) {
for (; *str != '\0' && strchr(delimiters, *str) == NULL; ++str)
;
return str;
}
RvStrTok* rvStrTokConstruct(RvStrTok* t, char* delimiters, char* str) {
t->delimiters = delimiters;
t->p = rvStrFindFirstNotOf(str, delimiters);
return t;
}
char* rvStrTokGetToken(RvStrTok* t) {
char* str = t->p;
if (*str == '\0')
return NULL;
t->p = rvStrFindFirstOf(t->p, t->delimiters);
if (*(t->p) != '\0') {
*(t->p) = '\0';
t->p = rvStrFindFirstNotOf((t->p) + 1, t->delimiters);
}
return str;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -