Skip to content

Instantly share code, notes, and snippets.

@raphaelnapi
Created July 10, 2020 22:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save raphaelnapi/ed0c29e049ee6dd0d36d687b77b9ee0a to your computer and use it in GitHub Desktop.
Save raphaelnapi/ed0c29e049ee6dd0d36d687b77b9ee0a to your computer and use it in GitHub Desktop.
//Header para manipulação de Strings em C
//por Raphael Pina Viana
//funções:
//char* upper(char* str)
//char* lower(char* str)
//int mestoi(char* mes)
//char* itomes(int i)
//char* replace(char* str, char* oldc, char* newc)
//int splitcount(char* string, char* separator)
//char* _split(char* string, char* separator, int pos)
//char* removeFirstSplit(char* string, char* separator)
//char* mid(char* str, int ipos, int length)
//char* midpos(char* str, int ipos, int fpos)
//int instr(int ipos, char* str1, char* str2)
//int fimstr(int ipos, char* str1, char* str2)
char* upper(char* str){
static char* ret;
ret = realloc(ret, strlen(str) + 1);
int i;
memset(ret, 0, strlen(str) + 1);
for(i = 0; i < strlen(str); i ++)
*(ret + i) = toupper(*(str + i));
return ret;
}
char* lower(char* str){
static char* ret;
ret = realloc(ret, strlen(str) + 1);
int i;
memset(ret, 0, strlen(str) + 1);
for(i = 0; i < strlen(str); i ++)
*(ret + i) = tolower(*(str + i));
return ret;
}
int mestoi(char* mes){
if(strcmp(lower(mes), "janeiro") == 0)
return 1;
else if(strcmp(lower(mes), "fevereiro") == 0)
return 2;
else if(strcmp(lower(mes), "março") == 0)
return 3;
else if(strcmp(lower(mes), "abril") == 0)
return 4;
else if(strcmp(lower(mes), "maio") == 0)
return 5;
else if(strcmp(lower(mes), "junho") == 0)
return 6;
else if(strcmp(lower(mes), "julho") == 0)
return 7;
else if(strcmp(lower(mes), "agosto") == 0)
return 8;
else if(strcmp(lower(mes), "setembro") == 0)
return 9;
else if(strcmp(lower(mes), "outubro") == 0)
return 10;
else if(strcmp(lower(mes), "novembro") == 0)
return 11;
else if(strcmp(lower(mes), "dezembro") == 0)
return 12;
}
char* itomes(int i){
static char* mes;
mes = realloc(mes, 16);
memset(mes, 0, 16);
switch(i){
case 1:
strcpy(mes, "janeiro");
break;
case 2:
strcpy(mes, "fevereiro");
break;
case 3:
strcpy(mes, "março");
break;
case 4:
strcpy(mes, "abril");
break;
case 5:
strcpy(mes, "maio");
break;
case 6:
strcpy(mes, "junho");
break;
case 7:
strcpy(mes, "julho");
break;
case 8:
strcpy(mes, "agosto");
break;
case 9:
strcpy(mes, "setembro");
break;
case 10:
strcpy(mes, "outubro");
break;
case 11:
strcpy(mes, "novembro");
break;
case 12:
strcpy(mes, "dezembro");
break;
}
return mes;
}
char* replace(char* str, char* oldc, char* newc){
int i; //loop frase
int z; //loop para comparar oldc inteiro
int offset; //diferença de caracteres para ret se newc for maior que oldc
static char* ret;
ret = realloc(ret, strlen(str) - strlen(oldc) + strlen(newc) + 1);
memset(ret, 0, strlen(str) - strlen(oldc) + strlen(newc) + 1);
offset = 0;
for(i = 0; i < strlen(str); i ++){
for(z = 0; z < strlen(oldc); z ++){
if(*(str + i + z) != *(oldc + z))
break;
}
if(z == strlen(oldc)){
strcat(ret, newc);
i += strlen(oldc) - 1;
offset += strlen(newc) - strlen(oldc);
}
else
*(ret + i + offset) = *(str + i);
}
*(ret + i + offset) = '\0';
return ret;
}
int splitcount(char* string, char* separator){
int i;
int z;
int bEncontrouSeparador = 0;
int count = 1;
for(i = 0; i < strlen(string); i ++){
if(*(string + i) == *separator){
for(z = 0; z < strlen(separator); z ++){
if(*(string + i + z) == *(separator + z))
bEncontrouSeparador = 1;
else{
bEncontrouSeparador = 0;
break;
}
}
}
if(bEncontrouSeparador == 1){
count ++;
i = i + strlen(separator) - 1;
bEncontrouSeparador = 0;
}
}
return count;
}
char* _split(char* string, char* separator, int pos){
static char* ret;
int i;
int z;
int c = 0;
int currentpos = 0;
int bEncontrouSeparador = 0;
ret = realloc(ret, strlen(string) + 1);
//zera ret
for(i = 0; i < strlen(string) + 1; i ++)
*(ret + i) = '\0';
for(i = 0; i < strlen(string); i ++){
//Encontrou separador
if(*(string + i) == *separator){
for(z = 0; z < strlen(separator); z ++){
if(*(string + i + z) == *(separator + z))
bEncontrouSeparador = 1;
else{
bEncontrouSeparador = 0;
break;
}
}
}
if(currentpos == pos && bEncontrouSeparador == 0){
*(ret + c) = *(string + i);
c ++;
}
if(bEncontrouSeparador == 1){
currentpos ++;
i = i + strlen(separator) - 1;
bEncontrouSeparador = 0;
if(currentpos > pos)
break;
}
}
return ret;
}
char* removeFirstSplit(char* string, char* separator){
static char* ret;
int i, z;
ret = realloc(ret, strlen(string) + 1);
//zera ret;
for(i = 0; i < strlen(string) + 1; i ++)
*(ret + i) = '\0';
z = splitcount(string, separator);
for(i = 1; i < z; i ++){
strcat(ret, _split(string, separator, i));
if(i < z - 1)
strcat(ret, separator);
}
return ret;
}
char* mid(char* str, int ipos, int length){
static char* ret;
int i;
ret = realloc(ret, 1024);
memset(ret, 0, 1024);
for(i = ipos; i < ipos + length; i ++){
*(ret + i - ipos) = *(str + i);
}
return ret;
}
char* midpos(char* str, int ipos, int fpos){
static char* ret;
int i;
ret = realloc(ret, 1024);
memset(ret, 0, 1024);
for(i = ipos; i <= fpos; i ++){
*(ret + i - ipos) = *(str + i);
}
return ret;
}
int instr(int ipos, char* str1, char* str2){
int i; //caracteres em str1
int z; //caracteres em str2
if(ipos >= strlen(str1)) //posição inicial nao pode ser maior que str1.length
return -2;
for(i = ipos; i < strlen(str1); i ++){ //LOOP em str1
for(z = 0; z < strlen(str2); z ++){ //LOOP em str2 comparando cada caracter
if(*(str1 + i + z) != *(str2 + z)) //se caracter for diferente passa para proximo caracter de str1
break;
}
if(z == strlen(str2)) //se z == str2.length então loop rodou até o final (todos os caracteres foram comparados e retornaram true)
return i; //retorna posição do primeiro caracter da sequencia de caracteres
}
return -1; //fim do loop sem encontrar str2 em str1
}
int fimstr(int ipos, char* str1, char* str2){
int i; //caracteres em str1
int z; //caracteres em str2
if(ipos >= strlen(str1)) //posição inicial nao pode ser maior que str1.length
return -2;
for(i = ipos; i < strlen(str1); i ++){ //LOOP em str1
for(z = 0; z < strlen(str2); z ++){ //LOOP em str2 comparando cada caracter
if(*(str1 + i + z) != *(str2 + z)) //se caracter for diferente passa para proximo caracter de str1
break;
}
//for parece incrementar +1 em i mesmo após o break;
if(z == strlen(str2)) //se z == str2.length então loop rodou até o final (todos os caracteres foram comparados e retornaram true)
return i + z; //retorna posição do primeiro caracter APÓS sequencia de caracteres
}
return -1; //fim do loop sem encontrar str2 em str1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment