MIdNight 0 Denunciar post Postado Março 8, 2010 Hi, eu tava reproduzindo o comando de PHP explode em C e agora tou com o erro de 'memória não pode ser written', o prog não ta conseguindo escrever na memoria. Todo o meu .c eh: #include <stdio.h> #include <stdlib.h> #include <string.h> int substr_count(char str[], char substr[]); char **explode(char *delimiter, char *str); int main(int argc, char *argv[]) { char **var = explode("/", "01/08/1995"); printf("%s", var[0]); free(var); getch(); return(0); } int substr_count(char str[], char substr[]) { int i, j, count = i = 0; while (*(str+i)) { for (j = 0; substr[j] && str[i + j] == substr[j]; j++); if (substr[j] == '\0') { ++count; i += j; } else { ++i; } } return count; } char **explode(char *delimiter, char *str) { int count = substr_count(str, delimiter), i, j, k = 0; char **str_r = calloc(count, strlen(str)); for (i = 0; i < count; i++) { for (j = 0; *(str+j);j++,k++) { str_r[i][j] = str[j+k]; } k += strlen(delimiter) - 1; } return str_r; } O erro eh nesta linha: str_r[i][j] = str[j+i*tam];Alguém sabe como me ajudar? .-. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Março 8, 2010 Não entendi porque você está usando notação de ponteiro com um array e porque está complicando tanto. O substr_count...Você pode usar o strchr num loop. int substr_count(char sep, char *str) { int count = 0; char *cp = str; while ((cp = strchr(cp, sep)) != NULL) { count++; cp +=sizeof(char); } return count+1; } E isso já poderia ser o próprio explode se você retornar um array alocado dinamicamente: char ** substr_count(char sep, char *str) { char **arr_str = (char**) malloc(0); int count = 0; char *cp = str; char *apos = str; while ((cp = strchr(cp, sep)) != NULL) { count++; arr_str = (char **)realloc(arr_str, count*sizeof(char*)); arr_str[count-1] = (char *)realloc(arr_str[count-1], cp - apos); strncpy(arr_str[count-1], apos, cp - apos); cp +=sizeof(char); apos = cp; } arr_str = (char **)realloc(arr_str, (count+1)*sizeof(char*)); arr_str[count] = (char *)realloc(arr_str[count], &str[strlen(str)] - apos); strncpy(arr_str[count], apos, &str[strlen(str)] - apos); return arr_str; } Se for o caso de procurar uma substring, dá p/ usar regex.h , strspn, strpbrk, strstr ao invés de fazer isso na mão: char ** substr_count(char *sep, char *str) { char **arr_str = (char**) malloc(0); int count = 0; char *cp = str; char *apos = str; while ((cp = strstr(cp, sep)) != NULL) { count++; arr_str = (char **)realloc(arr_str, count*sizeof(char*)); arr_str[count-1] = (char *)realloc(arr_str[count-1], cp - apos); strncpy(arr_str[count-1], apos, cp - apos); cp +=sizeof(char)*strlen(sep); apos = cp; } arr_str = (char **)realloc(arr_str, (count+1)*sizeof(char*)); arr_str[count] = (char *)realloc(arr_str[count], &str[strlen(str)] - apos); strncpy(arr_str[count], apos, &str[strlen(str)] - apos); return arr_str; } Repare que a única coisa que eu alterei foi o nome da função e a adição em cp. Compartilhar este post Link para o post Compartilhar em outros sites
MIdNight 0 Denunciar post Postado Março 8, 2010 Fiz na mão e foi bem simples, e o erro não encontra-se nele, eu gostaria de saber como concertar o meu codigo e o porquê do erro atual .-. E o meu usa 'char' e não 'char *' como separador. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Março 8, 2010 Como assim o erro não se encontra nele? Já prestou atenção p/ ver se você está alocando memória antes de fazer uma atribuição? Starting program: /home/isis/src/a.out Breakpoint 1, explode (delimiter=0x80486eb "/", str=0x80486e0 "01/08/1995") at explode.c:41 41 str_r[j] = str[j+i*tam]; (gdb) p str_r $1 = (char **) 0x804b008 (gdb) p str_r[0] $2 = 0x0 E o meu usa 'char' e não 'char *' como separador. Releia o próprio código: char **explode(char *delimiter, char *str) char **var = explode("/", "01/08/1995"); Compartilhar este post Link para o post Compartilhar em outros sites
MIdNight 0 Denunciar post Postado Março 8, 2010 Note, usei aspa duplas .-. E o erro que me referi não é no substr_count, já testei ele a parte. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Março 8, 2010 Note, usei aspa duplas .-. Aspas duplas = string = char[] = char * Aspas simples = char E o erro que me referi não é no substr_count, já testei ele a parte. E leu o que foi escrito no post anterior? Subentende-se que alguém que usa calloc sabe que tem que alocar espaço p/ char * também. Compartilhar este post Link para o post Compartilhar em outros sites
MIdNight 0 Denunciar post Postado Março 9, 2010 eu só usei char *, e eu aloquei o espaço. Em momento algum usei as aspas simples. E esta não eh minha pretensão. @Edit Ah ta, vi agora a bosta que falei, era para ter falado o contrário: E o meu usa 'char *' e não 'char' como separador. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Março 9, 2010 Certeza que usou só char * e que alocou espaço? char **str_r = calloc(count, strlen(str)); Cadê a alocação para os char * do str_r? Compartilhar este post Link para o post Compartilhar em outros sites
MIdNight 0 Denunciar post Postado Abril 4, 2010 Eu acreditava que alocando assim já que o segundo parâmetro é o tamanho, eu estaria alocando para cada índice ._. Errei? Se sim, como posso alocar para todos na hora da inicialização? (Ou não tem?) Compartilhar este post Link para o post Compartilhar em outros sites