Dividir String em C

PHP, Java, JavaScript, XML, XHTML, HTML, CSS, ASP, Delphi, Assembly, LaTeX, C, UML, Flash, Perl, SQL, Python, Zope, Pascal, WML. Se conhece mais de 3 siglas referidas, este é o forum para si.

Moderadores: Administradores, Moderadores

Dividir String em C

Mensagempor Squall2000 » Terça Out 23, 2007 7:50

Tou com um problema do catano e não sei bem porque...
O que eu ando a tentar fazer é dividir uma String em bocados de 2048 char para posteriormente enviar envia socket. O que eu não percebo é porque é que isto me está a dar Segmentation fault no fim da execução e depois de a divisão ser feita correctamente.

Deixo aqui o codigo:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void split();

int main(void) {
char* texto = "Teste bonito, e isto é sem duvida um texto feito pelo grande e unico Hemarroida, sim aquela bela pessoa que é capaz de salvar o mundo das garras de Arganok, apesar de ninguem saber quem é, nem mesmo eu, mas isso não interessa para nada... como isto tá a demorar tempo demais vamos fazer spam: IRFGIOD RJFIO DRHFGDR HUIOFGHDR UGHDIRFGIO DRJFIODRHFGDR HUIOFGHDRUGHDIRFG IODRJFIODRHFGDR HUIOFGHDRUGHDIR FGIODRJFIODRHF GDRHUIOFGHDRUGHDI RFGIODRJFIODRHF GDRHUIOFGHDRUGH DIRFGIODRJFIODRHFG DRHUIOFGHDRUGHDIR FGIODRJFIODRHFGD RHUIOFGHDRUGHDIR FGIODRJFIODRHFGD RHUIOFGHDRUGHDIR FGIODRJFIODRHFGDRHU IOFGHDRUGHDIRFGI ODRJFIODRHFGDRHUI OFGHDRUGHDIRFGIOD RJFIODRHFGDRHUIOFG HDRUGHDIRFGIODRJF IODRHFGDRHUIOFGHDRU GHDIRFGIODRJFIODRHF GDRHUIOFGHDRUGHDIRFG IODRJFIODRHFGDRHUIOFG HDRUGHDIRFGIODRJF IODRHFGDRHUIOFGHDRU GHDIRFGIODRJFIOD RHFGDRHUIOFGHDRUGH DIRFGIODRJFIODRHFGD RHUIOFGHDRUGHDIRFGIO DRJFIODRHFGDRHUIOFGH DRUGHDIRFGIODRJFIODRH FGDRHUIOFGHDRUGHDIR FGIODRJFIODRHFGDRHUIOF GHDRUGHDIRFGIODRJFIODRHF GDRHUIOFGHDRUGHDIRFGI ODRJFIODRHFGDRHUIOFGHD RUGHDIRFGIODRJFIODRHFG DRHUIOFGHDRUGHDIRFGIODRJ FIODRHFGDRHUIOFGHDRUG HDIRFGIODRJFIODRHFGDRH UIOFGHDRUGHDIRFGIO DRJFIODRHFGDRHUIOFG HDRUGHDIRFGIODRJFIO DRHFGDRHUIOFGHDRUGHDIR FGIODRJFIODRHFGD RHUIOFGHDRUGH DIRFGIODRJFIODRHF GDRHUIOFGHDRUG HDIRFGIODRJFIODRHFGDR HUIOFGHDRUGHDIRFG IODRJFIODRHFGDRHUIO FGHDRUGHDIRFGIODRJFIOD RHFGDRHUIOFGHDRUGHD IRFGIODRJFIODRHFGDRHU IOFGHDRUGHDIRFGIODR JFIODRHFGDRHUIOFGHDR UGHDIRFGIODRJFIODRHFGDR HUIOFGHDRUGHDIRFGIODRJFI ODRHFGDRHUIOFG HDRUGHDIRFGIODRJF IODRHFGDRHUIOF GHDRUGHDIRFGI ODRJFIODRHFGDRH UIOFGHDRUGHDIR FGIODRJFIODR HFGDRHUIOFGHD RUGHDIRFGIO DRJFIODRHFGD RHUIOFGHDRUGH DIRFGIODRJFIODRHFGDRH UIOFGHDRUGHDIRF GIODRJFIODRHFG DRHUIOFGHDRUGH DIRFGIODRJFIOD RHFGDRHU IOFGHDRUGHDIRFGIOD RJFIODRHFGDRHUIOF GHDRUGHDIRFG IODRJFIODRHFGDR HUIOFGHDRUGH DIRFGIODRJFIOD RHFGDRHUIOFG HDRUGHDIRFGIOD RJFIODRHFGDRHUIOF GHDRUGHDIRFGIO DRJFIODRHFGDRH UIOFGHDRUGHDIR FGIODRJFIODRH FGDRHUIOFGHDRUG HDIRFGIODRJFIODRH FGDRHUIOFGHDRUG HDIRFGIODRJFIOD RHFGDRHUIOFGH DRUGHDIRFGIOD RJFIODRHFGDR HUIOFGHDRUGHDIR FGIODRJFIODRH FGDRHUIOFGHDR UGHDIRFGIODRJFI ODRHFGDRHUIOFGHDRU GHDIRFGIODRJFI ODRHFGDRHU IOFGHD. Fim do SPAM! Olé";
split(texto);
return 0;
}

void split(char * coiso) {
char seg[2048];
char texto[strlen(coiso)];
int tamanho, numseg, seq;
strcpy(texto,coiso);
tamanho = strlen(texto);

printf("Tamanho: %d\n", tamanho);

numseg = 0;
while (tamanho > 0) {
tamanho = tamanho - 2048;
numseg++;
}

printf("Numero Seg: %d\n", numseg);

seq = 0;
while (numseg > seq) {

strncpy(seg, &texto[seq*2048], ((seq+1)*2048));
seg[2048] = '\0';

printf("Numero Segmento: %d, Numero Total: %d\n\n", seq, numseg);
printf("Enviar Segmento: %s\n\n", seg);
//send(seg);
seq++;
}
}


Se alguem me pudesse ajudar ficava mesmo muito agradecido. ;)
Squall2000
Aprendiz
Aprendiz
 
Mensagens: 30
Registado: Domingo Out 24, 2004 16:54

Mensagempor Fenrir » Terça Out 23, 2007 14:59

Segmentation fault costuma ser por tentares aceder a uma posição de memoria que tem lixo.

Por exemplo um array de 5 posicoes se tentas aceder a array[5] ele daria um segmentation fault...acho, já não mexo em C à muito tempo.
Avatar do Utilizador
Fenrir
Membro de Prata
Membro de Prata
 
Mensagens: 354
Registado: Segunda Set 20, 2004 22:33
Localização: Porto

Mensagempor r1sc0 » Sexta Out 26, 2007 23:11

e pa isto ja la vao uns tempinhos.. mas penso k pode ser disto..

tema ver com o tamanho do vector do tipo char seg...

ao declarar o k metes entre [] é o tamanho do vector.. 2048 no caso..
mas quando acedes ao vector lembra t k a contagem começa no 0, ou seja a ultima posição na verdade é o 2047..

portanto penso k seja aki o erro:
Código: Seleccionar todos
seg[2048] = '\0';


a correção seria declarar o vector com o tamanhao 2049.. ou atribuir o /0 a posição 2047... sinceramente já não me lembro qual seria a melhor solução.. so testando
r1sc0
Novato
Novato
 
Mensagens: 16
Registado: Sexta Out 26, 2007 22:29

Mensagempor SIG » Sábado Out 27, 2007 0:29

Experimenta assim (acho que tem um bug lá no meio :P):

Em relação à variável [b]ultimos_bytes[/b] estava a dar-me erros de acesso a memória quando o [b]n[/b] da função [b]strncpy[/b] era superior ao número de bytes existente.

[code]void split(char * coiso) {
int tamanho = strlen(coiso);
int num_segmentos = 0;
int segmento = 0;
int ultimos_bytes = 0;
int bytes_a_enviar = 0;

char seg_txt[2048];

while(tamanho > 0) {

tamanho -= 2048;

if(tamanho < 0) {
ultimos_bytes = tamanho + 2048;
}

num_segmentos++;
}

while(segmento < num_segmentos) {

bytes_a_enviar = (segmento == (num_segmentos - 1)) ? ultimos_bytes : 2048;

strncpy(seg_txt, coiso + (segmento * 2048), bytes_a_enviar);
seg_txt[bytes_a_enviar] = '\0';

printf("Tamanho: %d, Numero Segmento: %d, Numero Total: %d\n", strlen(seg_txt), (segmento + 1), num_segmentos);
printf("Enviar Segmento: %s\n\n", seg_txt);

segmento++;
}

getch();
}[/code]
Avatar do Utilizador
SIG
Aprendiz
Aprendiz
 
Mensagens: 30
Registado: Domingo Set 26, 2004 23:06


Voltar para Programação

Quem está ligado:

Utilizadores a ver este Fórum: Nenhum utilizador registado e 5 visitantes

cron