Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

MIdNight

Explode em C

Recommended Posts

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

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

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

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
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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.