c++ [problema com função da familia cctype]

Ronnie_03

Power Member
Boas,

Estou a fazer um projecto de c++, e tenho uma função que verifica se um caracter está presente numa string, e se estiver a função devolve o indice onde o caracter se encontra, se não devolve -1.

A parte do meu código que tem esta função é este:
Código:
[SIZE=2][COLOR=#0000ff]
[SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#000000] [COLOR=white]verifica_letra([/COLOR][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]char[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#000000] [COLOR=white]letra, string palavra)[/COLOR][/COLOR][/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]    char[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] c = tolower(letra);[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]    char[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] d = toupper(letra);[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]    if[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] (palavra.find(tolower(letra)) == string::npos)[/SIZE]
[SIZE=2]    {[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]          if[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] (palavra.find(toupper(letra)) == string::npos)[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]              return[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] -1;[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]          else[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]              return[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] palavra.find(toupper(letra));[/SIZE]
[SIZE=2]     }[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]    else[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]         return[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] palavra.find(tolower(letra));[/SIZE]
}

Esta função não está a funcionar correctamente, porque a função tolower(letra) e touppe(letra) estão a devolver numeros, em vez dos caracteres em minusculas e maiusculas.

O que eu gostava de saber é porquê que isso acontece, uma vez que acho que não estou a fazer nada de errado.


Cumps
 
Testei aqui e a tua função está a funcionar correctamente.

Que compilador é que usaste?
Eu por acaso tam,bém acho estranho não funcionar porque no exercicio anterior fiz a mesma coisa, só que as duas condições estavam no mesmo if, uma vez que a função anterior era booleana, e por isso não me interessava o indice da letra.


letra tem de ser um unsigned char, caso contrário o comportamento da função é imprevisível.
Eu vou experimentar declarar antes os caracteres como unsigned char e depois digo se funcionou.
Já agora, eu ontem estive a experiementar melhor isto e acho que a função devolve o código ascII do caracter.

amigo para quê reescrever codigo que ainda por cima vai ficar pior?

Desculpa mas não percebi o quê que queres dizer com isso.
 
Que compilador é que usaste?
Eu por acaso tam,bém acho estranho não funcionar porque no exercicio anterior fiz a mesma coisa, só que as duas condições estavam no mesmo if, uma vez que a função anterior era booleana, e por isso não me interessava o indice da letra.



Eu vou experimentar declarar antes os caracteres como unsigned char e depois digo se funcionou.
Já agora, eu ontem estive a experiementar melhor isto e acho que a função devolve o código ascII do caracter.



Desculpa mas não percebi o quê que queres dizer com isso.


Usei o compilador da Microsoft integrado no Visual Studio 2008. Acabei de testar com O IDE Dev-C++, que julgo que tem uma versão um pouco desactualizada do g++, e também funciona.

Não me parece que a variavel tenha de ser declarada como unsigned char, no cplusplus não refere nada sobre isso.

Btw, o que ele quer dizer é que podes usar algumas funções como o find_first_of, por exemplo.

Um exemplo:

Código:
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;


int verifica_letra(string letra, string palavra)
{
    transform(letra.begin(), letra.end(), letra.begin(), ::toupper);
    transform(palavra.begin(), palavra.end(), palavra.begin(), ::toupper);
    
    size_t pos = palavra.find_first_of(letra);
    
    return pos;
}

int main()
{
    string str = "palavra";
    string c = "A";
    int n = verifica_letra(c, str);
    cout << n << endl;
    return 0;
}
 
Última edição:
Eu o que quero fazer é ver quantas vezes é que um caracter aparece na string.
Eu tenho um ciclo for que percorre a string até ao fim, e para cada caracter eu queria ver se esse caracter estava na outra string e quantas vezes.

O que eu precisava de saber é se existe alguma função que devolva um caracter dando-lhe o código ascii do caracter, porque a função tolower está a devolver o código ascii.
 
Back
Topo