[C++] Como usar substr?


02-11-2003 por Danilo_Horta
[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.
02-11-2003 por kbum
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.
02-11-2003 por Danilo_Horta
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 ;(
02-11-2003 por romulo
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; }
02-11-2003 por Danilo_Horta
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
04-11-2003 por Lgub
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).
04-11-2003 por jqueiroz
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); ^^^^^^
04-11-2003 por Danilo_Horta
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
 
Guia do Hardware Melhores Tópicos