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