1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

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

Discussão em 'Programação' iniciada por Ronnie_03, 3 de Março de 2009. (Respostas: 7; Visualizações: 984)

  1. Ronnie_03

    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
     
  2. letra tem de ser um unsigned char, caso contrário o comportamento da função é imprevisível.
     
  3. OubeLa

    OubeLa Power Member

    Testei aqui e a tua função está a funcionar correctamente.
     
    Última edição: 3 de Março de 2009
  4. sapropel

    sapropel Power Member

  5. Ronnie_03

    Ronnie_03 Power Member

    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.
     
  6. OubeLa

    OubeLa Power Member


    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: 4 de Março de 2009
  7. sapropel

    sapropel Power Member

    deste-te ao trabalhar de abrir os links que postei?
    são basicamente membros da class std::string que fazem o que tu queres e mais e melhor.
     
  8. Ronnie_03

    Ronnie_03 Power Member

    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.
     

Partilhar esta Página