FórumGdH

Página Inicial do Guia do Hardware

Registrar FAQ Calendário Pesquisar Mensagens de Hoje Marcar Fóruns Como Lidos

Voltar   FórumGdH > Profissional > Programação, scripts, web e banco de dados
Bem-vindo ao FórumGdH
Não se esqueça de se registrar, é grátis . Nós temos 754.078 usuários, convidamos você fazer parte de nossa comunidade também! Se ainda não encontrou o que procura use nossa pesquisa. Esperamos que aprecie nosso trabalho.

Resposta
 
Opções do Tópico
Antigo 02-11-2003, 2:59   #1 (permalink)
Danilo_Horta
Novo Membro
 
Registrado em: Aug 2003
Mensagens: 91
Reputação: 18 Danilo_Horta está indo no caminho certo
Enviar mensagem via ICQ para Danilo_Horta
Padrão [C++] Como usar substr?

Preciso fazer esse tipo de linha de código funcionar!

Código:
char temp[40], char prefix[40]; int length; temp = prefix.substr(1, length-1);
Mas o Borland dá esse erro: Structure required on left side of . or .*

Sei que prefix não é uma estrutura, é uma string. E para funcionar esse tipo de código, devo definir alguma classe (?), que seria um objeto (?).

É que eu não sei programar em C++, apenas estou aprendendo C. Só que, no livro do Tenenbaum, ele usa a função substr() (ex.: substr(temp, 1, length-1, prefix), mas parece que não existe mais ou não encontrei alguma biblioteca que a tenha. Não tenho idéia de como adicionar uma classe (?) no meu programa, nem nada relacionado à programação OO (?). Queria saber apenas o que preciso fazer para esse última linha funcionar!

Espero que me ajudem, é muito importante.
Danilo_Horta está offline   Responder com Quote
Antigo 02-11-2003, 9:42   #2 (permalink)
kbum
Novo Membro
 
Registrado em: Sep 2003
Localização: Londrina - PR
Mensagens: 61
Reputação: 17 kbum está indo no caminho certo
Enviar mensagem via AIM para kbum
Padrão

prefix não é um array of characters não? Eu não tenho nem idéia de como essa função que vc quer usar funciona e nem da tempo de eu pesquisar agora, mas pelo que eu vi ela trabalha com strings, então tenta incluir o header <string> e dai declara a variável prefix como string e vê se da certo.
kbum está offline   Responder com Quote
Antigo 02-11-2003, 13:10   #3 (permalink)
Danilo_Horta
Novo Membro
 
Registrado em: Aug 2003
Mensagens: 91
Reputação: 18 Danilo_Horta está indo no caminho certo
Enviar mensagem via ICQ para Danilo_Horta
Padrão

Array of caracters é uma string. Que eu saiba, não existe outra forma de declarar uma string em C/C++ que não seja assim. E já tenho #define <string.h> no header do meu programa.

Aliás, vou postá-lo para ver se fica mais fácil de me ajudar.

Código:
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAXLENGTH 40 int find(char str[]); void convert(char prefix[], char postfix[]); int main (void); int main(void) { char prefix[MAXLENGTH], postfix[MAXLENGTH]; int n; //temp = temp2.substr(1, length-1); while ((prefix[n++] = getchar()) != '\n') prefix[n--] = '\0'; convert(prefix, postfix); printf ("%s%s%s%s", "a expressao prefix eh ", prefix, "\n a posfix eh ", postfix); getch(); } /* fim main */ void convert(char prefix[], char postfix[]) { char opnd1[MAXLENGTH], opnd2[MAXLENGTH]; char post1[MAXLENGTH], post2[MAXLENGTH]; char temp[MAXLENGTH]; char op[2]; int length; int i, j, m, n; if ((length = strlen(prefix)) == 1) { if (isalpha(prefix[0])) { postfix[0] = prefix[0]; postfix[1] = '\0'; return; } /* fim if */ printf ("\nstring prefixa invalida"); exit(1); } /* fim if */ /* A string prefixa tem mais de um caratere. Extraia o operador e os temanhos dos dois operandos */ op[0] = prefix[0]; op[1] = '\0'; temp = prefix.substr(1, length-1); m = find(temp); temp = prefix.substr(m+1, length-m-1); n = find(temp); if ((op[0] != '+' && op[0] != '-' && op[0] != '*' && op[0] != '/') || (m == 0) || (n == 0) || (m+n+1 != length)) { printf ("\nstring prefixa invalida"); exit(1); } /* fim if */ opnd1 = prefix.substr(1, m); opnd2 = prefix.substr(m+1, n); convert(opnd1, post1); convert(opnd2, post2); strcat(post1, post2); strcat(post1, op); postfix = post1.substr(0, length); } /* fim convert */ int find(char str[]) { char temp[MAXLENGTH]; int length; int i, j, m, n; if ((length = strlen(str)) == 0) return (0); if (isalpha(str[0]) != 0) /* Primeiro caractere eh uma letra. Esta letra eh a substring inicial. */ return (1); /* caso contrario encontre o primeiro operando */ if (strlen(str) < 2) return (0); temp = str.substr(1, length-1); m = find(temp); if (m == 0 || strlen(str) == m) /* nenhum operando prefixo valido ou nenhum segundo operando */ return (0); temp = str.substr(m+1, length-m-1); n = find(temp); if (n == 0) return (0); return (m+n+1); } /* fim find */
Mesmo assim, valeu kbum :P. Os únicos erros são nas linhas que contém essa substr. Pelo que procurei em páginas, isso que estou tentando fazer precisa de uma class (?), chamada basic_string (?). Não sei implementar. Por favor, me ajudem ;(
Danilo_Horta está offline   Responder com Quote
Antigo 02-11-2003, 13:26   #4 (permalink)
romulo
Zumbi
 
Registrado em: Dec 2001
Localização: Fortaleza / CE
Mensagens: 7.506
Reputação: 30 romulo está indo no caminho certo
Enviar mensagem via ICQ para romulo
Padrão

Você tem que usar o template "string" da STL. Por exemplo:

Código:
#include <iostream> #include <string> using namespace std; int main() { string s; s.assign("ForumGDH"); cout << s.substr(5, 3) <<endl; return 0; }
__________________
Minha coleção de jogos (todos originais)
romulo está offline   Responder com Quote
Antigo 02-11-2003, 15:33   #5 (permalink)
Danilo_Horta
Novo Membro
 
Registrado em: Aug 2003
Mensagens: 91
Reputação: 18 Danilo_Horta está indo no caminho certo
Enviar mensagem via ICQ para Danilo_Horta
Padrão

valeu cara
pretendo aprender mais disso depois

mas pensei melhor e acho que nao posso fazer desse jeito, pois o professor nao ensinou ainda

entou eu mesmo fiz a substr
olha:
Código:
void substr (char *s1, int x, int y, char *s2) { int count, i = 0; for (count = x; i < y;count++, i++) s2[i] = s1[count]; s2[i] = '\0'; }
Mesmo assim, valeu pela ajuda
Danilo_Horta está offline   Responder com Quote
Antigo 04-11-2003, 9:11   #6 (permalink)
Lgub
Super Participante
 
Avatar de Lgub
 
Registrado em: Dec 2001
Mensagens: 937
Reputação: 22 Lgub está indo no caminho certo
Padrão

O problema todo é que você estáva querendo usar uma função que é da class String(do STL do C++), com um programa puro C(que pelo o que vc falou é o que vc está apredendo).
__________________
Linux User:#326216
Intel I7 - 920 - 6G DDR3 Tripple Channel @1600 - Geforce 285 1G.
Programador ADVPL(Fazer o que é o que ta pagando as contas no momento...)
Lgub está offline   Responder com Quote
Antigo 04-11-2003, 18:16   #7 (permalink)
jqueiroz
Highlander
 
Avatar de jqueiroz
 
Registrado em: May 2002
Localização: Tijuca/RJ
Idade: 9
Mensagens: 87.724
Reputação: 778 jqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputação
Padrão

Danilo, vc poderia usar a função não-oo strncpy para fazer o que vc quer:

Código:
char temp[40], char prefix[40]; int length, offset; strncpy(temp, prefix+offset, length);
Outra coisa, vc não pode atribuir um valor a um array, só a um ponteiro. Com o array vc só pode copiar o conteúdo da string pra ele. No teu código original vc cometia esse erro:

Código:
temp = prefix.substr(1, length-1); ^^^^^^
__________________
Visite Quepolis (link de indicação) | "chmod 777 nunca ajudou ninguém" (c) 2002-2010 JQueiroz/FGdH
CCNP: √ ² CCSI: □ | Conheça o Novo Bebuns
jqueiroz está offline   Responder com Quote
Antigo 04-11-2003, 19:11   #8 (permalink)
Danilo_Horta
Novo Membro
 
Registrado em: Aug 2003
Mensagens: 91
Reputação: 18 Danilo_Horta está indo no caminho certo
Enviar mensagem via ICQ para Danilo_Horta
Padrão

Eu sei disso (acho que esqueci de dizer). A função strcpy soluciona esse "problema". strcpy(destino, origem);

E sobr a funcao strncpy, nao a conhecia. Bom, agora já foi. Fiz eu mesmo uma funçãozinha e o programa roda que é uma beleza
Danilo_Horta está offline   Responder com Quote
Resposta


Opções do Tópico

Regras de Mensagens
Você não pode criar tópicos
Você não pode postar respostas
Você não pode anexar arquivos
Você não pode editar suas mensagens

Código vB está Ligado
Smiles estão Ligado
Código [IMG] está Ligado
Código HTML está Desligado
Ir para...


Horários baseados na GMT -3. Agora são 21:03.