Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

MrGil

[Resolvido] Duvida - Manipulação de string

Mensagens Recomendadas

MrGil

Boa Tarde,

Eu estou a aprender C há pouco tempo e deparei-me com este problema que não consigo resolver:

char * split(char * str, char operador [1]) {
char * pch;
pch = strtok(str,"*");
return str;
}

Na linha: pch = strtok(str,"*"); Tanto a variavel "pch" com a "str" são alteradas para o mesmo valor. Mas eu preciso de manter intacta a informação da variavel str.

semttulobar.png

Já tentei criar mais uma variavel e atribuir-lhe o mesmo valor assim:

char * split(char * str, char operador [1]) {
char * pch;
char * nova_variavel = str;
pch = strtok(str,"*");
return str;
}

Mas o problema continua, pois todas as variaveis são alteradas novamente.

Alguem sabe do que se trata?

Obrigado,

Cumprimentos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

1º de tudo, a utilização do strtok é incorrecta

verifica este exemplo para veres como se faz :

/* strtok example : source : http://www.cplusplus.com/reference/cstring/strtok/ */
#include <stdio.h>
#include <string.h>

int main ()
{
 char str[] ="- This, a sample string.";
 char * pch;
 printf ("Splitting string \"%s\" into tokens:\n",str);
 pch = strtok (str," ,.-");
 while (pch != NULL)
 {
   printf ("%s\n",pch);
   pch = strtok (NULL, " ,.-");
 }
 return 0;
}

2º. fazer a atribuição de um ponteiro não é copiar uma string. a única coisa que estás a fazer é que o valor da variável atribuida é igual à do ponteiro (um inteiro que representa a posição de memória onde se encontra a string)

para copiar uma string (algo que deverás fazer porque a função strtok é destrutiva) seria

char * str = "teste";
char * copy = malloc(strlen(str)+1); // alocar memória para a cópia, caracteres da string mais o terminador '\0'

strcpy(copy, str); // copiar a string

// ...

free(copy); // libertar a memória alocada


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

O strtok(), como referido na documentação, altera a string que estamos a tratar.

A maneira mais rápida para evitar a alteração da string original é fazer uma cópia e usar a cópia no strtok() ...

char *copia = malloc(strlen(original) + 1);
if (!copia) /* deal with memory error */;
strcpy(copia, original);
/* usa strtok() com copia */
free(copia);

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
MrGil

Desde já obrigado pela resposta,

Mas, ao tentar compilar a seguinte linha:

char *copia = malloc(strlen(str) + 1);

dá o seguinte erro: "error C2440: 'initializing' : cannot convert from 'void *' to 'char *'"

Qual é o problema agora?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

o problema é que estás a compliar com um compilador de c++ e não de c

ele é um bocado esquisito no que toca a este tipo de cast

para eliminar a mensagem de erro, faz o cast explícito do valor de retorno da função malloc


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

para eliminar a mensagem de erro ... configura o teu compilador para aceitar C em vez de se limitar a C++.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

para eliminar a mensagem de erro ... configura o teu compilador para aceitar C em vez de se limitar a C++.

o compilador (pelas imagens apresentadas no primeiro post) deverá ser VSC++, eu não sei como fazer isso (pouco o uso), será que alguem sabe fazer ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
MrGil

o compilador (pelas imagens apresentadas no primeiro post) deverá ser VSC++, eu não sei como fazer isso (pouco o uso), será que alguem sabe fazer ?

Eu encontrei um forum onde, num dos topicos, explicam como fazer isso...

Segui os passos e funcionou, ou seja o erro desapareceu

http://www.daniweb.com/software-development/cpp/threads/16256/compiling-c-in-visual-studio.net

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.