Enviado em 23/04/2021 - 21:46h
Recentemente, seguindo um exercício propostos por uma apostila online desenvolvi a minha própria biblioteca de manipação de strings: a mystring.h. Eu não sei se ela ficou "100%", portanto eu gostaria que vocês me ajudassem tirando algumas das minhas dúvidas e sugerindo soluções mais eficientes para a minha biblioteca.
//10/04/2021 - ZXKN-60R
#ifndef MYSTRING_H
#define MYSTRING_H
#include <stdlib.h>
//Funções de exame de string
extern size_t my_strlen(const char *s);
extern int my_strcmp(const char *s1, const char *s2);
extern int my_strncmp(const char *s1, const char *s2, size_t n);
extern const char *my_strchr(const char *s, int c);
extern const char *my_strrchr(const char *s, int c);
extern size_t my_strspn(const char *s, const char *accept);
extern size_t my_strcspn(const char *s, const char *reject);
extern const char *my_strpbrk(const char *s, const char *accept);
extern const char *my_strstr(const char *haystack, const char *needle);
//funções de manipulação de strings
extern char *my_strcpy(char *dest, const char *src);
extern char *my_strncpy(char *dest, const char *src, size_t n);
extern char *my_strcat(char *dest, const char *src);
extern char *my_strncat(char *dest, const char *src, size_t n);
extern void *my_memset(void *s, int c, size_t n);
extern void *my_memcpy(void *dest, const void *src, size_t n);
extern int my_memcmp(const void *s1, const void *s2, size_t n);
extern const void *my_memchr(const void *s, int c, size_t n);
extern const void *my_memrchr(const void *s, int c, size_t n); //não oficial da string.h
#endif //MYSTRING_H
#include "mystring.h"
//Funções de exame de string
size_t my_strlen(const char *s){
size_t lenght=0;
while(s[lenght]!='\0'){
lenght++;
}
return lenght;
}
int my_strcmp(const char *s1, const char *s2){
int diff=0;
for(unsigned int i=0; i<=my_strlen(s1); i++){
if(s1[i]!=s2[i]){
diff=(int)s1[i]-(int)s2[i];
break;
}
}
return diff;
}
int my_strncmp(const char *s1, const char *s2, size_t n){
int diff=0;
for(unsigned int i=0; i<=n; i++){
if(s1[i]!=s2[i]){
diff=(int)s1[i]-(int)s2[i];
break;
}
}
return diff;
}
const char *my_strchr(const char *s, int c){
while((*s!=(char)c) && (*s!='\0')){
s++;
}
if(*s!=(char)c){
s=NULL;
}
return s;
}
const char *my_strrchr(const char *s, int c){
size_t i=0;
for(size_t j=0; j<my_strlen(s); j++){
if(s[j]==(char)c){
i=j;
}
}
if(s[i]==(char)c){
s+=i;
}else{
s=NULL;
}
return s;
}
size_t my_strspn(const char *s, const char *accept){
size_t count=0;
for(size_t i=0; i<my_strlen(s); i++){
if(s[i]==accept[i]){
count++;
}else{
break;
}
}
return count;
}
size_t my_strcspn(const char *s, const char *reject){
size_t count=0;
for(size_t i=0; i<my_strlen(s); i++){
if(s[i]!=reject[i]){
count++;
}else{
break;
}
}
return count;
}
const char *my_strpbrk(const char *s, const char *accept){
int catch=0;
for(size_t i=0; i<my_strlen(s); i++){
for(size_t j=0; j<my_strlen(accept); j++){
if(s[i]==accept[j]){
s+=i;
catch++;
break;
}
}
if(catch!=0){
break;
}
}
if(catch==0){
s=NULL;
}
return s;
}
static int strstrcmp(size_t start, const char *haystack, const char *needle){
int diff=0;
haystack+=start;
while((*haystack!='\0') && (*needle!='\0')){
if(*haystack!=*needle){
diff=(int)*haystack-(int)*needle;
break;
}else{
haystack++;
needle++;
}
}
return diff;
}
const char *my_strstr(const char *haystack, const char *needle){
int catch=0;
size_t i, len=my_strlen(haystack);
for(i=0; i<len; i++){
if((haystack[i]==needle[0]) && (haystack[i+1]==needle[1])){
if(strstrcmp(i, haystack, needle)==0){
catch=1;
break;
}
}
}
if(catch==0){
for(i=0; i<len; i++){
if(strstrcmp(i, haystack, needle)==0){
catch=1;
break;
}
}
}
if(catch==0){
haystack=NULL;
}else{
haystack+=i;
}
return haystack;
}
//funções de manipulação de strings
char *my_strcpy(char *dest, const char *src){
size_t i=0;
while(src[i]!='\0'){
dest[i]=src[i];
i++;
}
dest[i]='\0';
return dest;
}
char *my_strncpy(char *dest, const char *src, size_t n){
size_t i=0;
while(i!=n){
dest[i]=src[i];
i++;
}
return dest;
}
char *my_strcat(char *dest, const char *src){
size_t i, len=my_strlen(dest);
for(i=0; (i<my_strlen(src)) && (src[i]!='\0'); i++){
dest[i+len]=src[i];
}
dest[i+len]='\0';
return dest;
}
char *my_strncat(char *dest, const char *src, size_t n){
size_t i, len=my_strlen(dest);
for(i=0; (i<n) && (src[i]!='\0'); i++){
dest[i+len]=src[i];
}
dest[i+len]='\0';
return dest;
}
void *my_memset(void *s, int c, size_t n){
unsigned char *ps=s;
for(size_t i=0; i<n; i++){
ps[i]=c;
}
return s;
}
void *my_memcpy(void *dest, const void *src, size_t n){
unsigned char *p_dest=dest;
const unsigned char *p_src=src;
for(size_t i=0; i<n; i++){
p_dest[i]=p_src[i];
}
return dest;
}
int my_memcmp(const void *s1, const void *s2, size_t n){
int diff=0;
const unsigned char *ps1=s1, *ps2=s2;
for(size_t i=0; i<n; i++){
if(ps1[i]!=ps2[i]){
diff=(int)ps1[i]-(int)ps2[i];
break;
}
}
return diff;
}
const void *my_memchr(const void *s, int c, size_t n){
const unsigned char *ps=s, uc=(unsigned char)c;
size_t i=0;
while((*ps!=uc) && (*ps!='\0') && (i<n)){
ps++;
i++;
}
if(*ps!=uc){
ps=NULL;
}
return ps;
}
const void *my_memrchr(const void *s, int c, size_t n){
const unsigned char *ps=s;
size_t i=0;
for(size_t j=0; j<n; j++){
if(ps[j]==(unsigned char)c){
i=j;
}
}
if(ps[i]==(unsigned char)c){
ps+=i;
}else{
ps=NULL;
}
return ps;
}
void *memset(void *s, int c, size_t n); //prótotipo da função de acordo com as páginas de manuais do Linux
Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char). //Descrição da memset de acordo com o site cpluscplus.com
...
int memcmp(const void *s1, const void *s2, size_t n); //prótotipo da função de acordo com as páginas de manuais do Linux
The memcmp() function compares the first n bytes (each interpreted as unsigned char) of the memory areas s1 and s2. //Descrição da memcmp de acordo com o comando man memcmp
...
void *memchr(const void *s, int c, size_t n); //prótotipo da função de acordo com as páginas de manuais do Linux
void *memrchr(const void *s, int c, size_t n); //prótotipo da função de acordo com as páginas de manuais do Linux
The memchr() function scans the initial n bytes of the memory area
pointed to by s for the first instance of c. Both c and the bytes of
the memory area pointed to by s are interpreted as unsigned char.
The memrchr() function is like the memchr() function, except that it
searches backward from the end of the n bytes pointed to by s instead
of forward from the beginning.
//Descrição das funções memchr e memrchr de acordo com o comando man memchr
The memcpy() function copies n bytes from memory area src to memory
area dest. The memory areas must not overlap. Use memmove(3) if the
memory areas do overlap.
Tabs are 8 characters, and thus indentations are also 8 characters. There are heretic movements that try to
make indentations 4 (or even 2!) characters deep, and that is akin to trying to define the value of PI to be 3.
Armazenando a senha de sua carteira Bitcoin de forma segura no Linux
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Grub não reconhece o Windows 11 (2)
como posso fazer overclock nesse programa? (1)
PC congelando em momentos aleatórios (em várias distros) (2)