Ir ao conteúdo
  • Cadastre-se

C++ não consigo concatenar e ler strings


Mr-86
Ir à solução Resolvido por arfneto,

Posts recomendados

Bom dia!! estava tentando migrar do codeblocks para o visual studio 2022, porém estou tentando fazer um jogo da forca simples, mas esta aparecendo erros que nunca me deparei no codeblocks. alguém poderia me explicar como resolve-los ?? segue onde esta o erro do codigo e as mensagens de erro.

void jogar(string palavra, string palavraresolvida, int tentativas) {

    string erros;
    char resp;
    bool veri;

    while (tentativas != 0) {

        cout << "Letras usadas: " << erros;
        cout << "\n";
        cout << "Tentativas disponiveis: " << tentativas << endl;
        cout << "\n";
        cout << palavraresolvida << endl;
        cout << "\n";
        cout << "Digite uma letra: ";
        getline(cin, tolower(resp));

        veri = verificar(palavra, resp);

        if (!veri) {
            tentativas--;
            erros = erros + " " + toupper(resp);
        }
    }

Eu sei que o codigo acima tem alguns erros, e coisas que possam ser melhoradas. mas meu principal problema sao os erros da imagem.

imagem_2023-01-20_013520507.png

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@Felipecfk Este é meu codigo completo, tentei fazer o que você falou mas ainda não resolveu.

#include <iostream>
#include <cstring>
#include <iomanip>
#include <cstddef>

using namespace std;
using std::string;

void pegaPala(string& palavra, string& palavraresolvida, int& tentativas);
void jogar(string palavra, int tentativas);
bool verificar(string palavra, char resp);

int main() {
    string palavra, letrasUsadas, palavraresolvida;
    int tentativas = 0;

    pegaPala(palavra, palavraresolvida, tentativas);
    jogar(palavra, tentativas);

}

void pegaPala(string& palavra, string& palavraresolvida, int& tentativas) {

    //abrir um aqui so de leitura, pegar uma palavra aleatoria e mandar para a palavra e fazer ja a quantidade de tentivas

    for (int i = 0; i < palavra.size(); i++) {
        palavraresolvida[i] << '_';
    }
}

void jogar(string palavra, string palavraresolvida, int tentativas) {

    string erros;
    char resp;
    bool veri;

    while (tentativas != 0 /*colocar uma verificaçao para ver se o jogador acertou todas as letras*/) {

        cout << "Letras usadas: " << erros;
        cout << "\n";
        cout << "Tentativas disponiveis: " << tentativas << endl;
        cout << "\n";
        cout << palavraresolvida << endl;
        cout << "\n";
        cout << "Digite uma letra: ";
        getline(cin, tolower(resp));

        veri = verificar(palavra, resp);

        if (!veri) {
            tentativas--;
            erros = erros + " " + toupper(resp);
        }
    }
}

bool verificar(string palavra, string& palavraresolvida, char resp) {
    for (int i = 0; i < palavra.size(); i++) {
        if (palavra[i] == resp)
            palavraresolvida[i] = resp;
        return true;
    }
    return false;
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Mr-86    o visual studio é uma IDE apropriada para a linguagem c++ , e talvez você ainda não saiba que a linguagem c++ aceita todos os comandos da linguagem c , mas o c++ é outra coisa , e seu código tem erros de sintaxe em comandos e que nem funciona em c e também não funciona em c++ , por exemplo o getline só recebe dados do tipo string e não char e nem char[] , mas para usar comandos do c como scanf precisa colocar essa diretiva logo no inicio   :

#define _CRT_SECURE_NO_WARNING   /// para scanf func
#define _getch() getch()         /// para o getch da conio.h   

 

1531088678_errodomr86.thumb.jpg.4ad3f32fc979c9ac3c206212683227ee.jpg

use um código parecido com esse  aqui  :

#define _CRT_SECURE_NO_WARNING
#include <iostream>
#include <string>
using namespace std;
bool verificar(string palavra,char resp)
{
    bool test = false;
    
    /// faze as verificaCOes

    return test;
}
void jogar(string palavra, string palavraresolvida, int tentativas)
{
    string erros;                           /// conteUdo da String
    cout << "erros |" << erros << " |<- Val iniciaL" << endl;
    char resp  = 'l';                       /// inicializa a variAveiL para teste
    bool veri  = true;
    string rep = "";                        /// ou usa o tipo "string" que eh do c++
    while ( tentativas != 0 ) 
    {
        cout << "Letras usadas ----------: " << erros << endl;
        cout << "Tentativas disponiveis -: " << tentativas << "\n" << endl;
        cout << palavraresolvida << "\n"     << endl;
        cout << "Digite uma letra: ";
        cin  >> resp;                        /// Func com cin >>
        cout << "val resp " <<resp <<  endl;
        cout << "uma string ";
        cin >> rep;
        rep = rep +  "h";                    /// a concatenaCAo em C++ usando string
        cout << "concat -= " << rep << endl;
        ///getline(cin,   tolower( resp ) ); /// não Func Desse Modo nem em C
        ///scanf("%c" , & toupper( resp ) ); /// seria o corespondente em C
        ///getline(cin,            resp   ); /// Nem Deesse aQui pois misturou c com C++
        veri = verificar( palavra ,resp   );
        if (!veri) 
        {
            tentativas--;                             /// conv p/ Maiusc e
            erros = erros + " " + (char)toupper(resp);/// concatenaCAo usando "char" da lingugem C
        }
    }
    cout << "Valor Da variAvel ( erros ) na saida =>=> " << erros << endl;
}
int main()
{
    std::cout << "Hello World!\n";
    jogar("ababa","lopol", 3);
}

 

e em c , para converter uma palavra ou frase inteira , para maiúsculas , você pode usar esse código aqui :

 

#define     _WIN32_WINNT 0x600
#define     _h GetStdHandle(STD_OUTPUT_HANDLE)
#include    <stdio.h>
#include    <stdlib.h>
#include    <conio.h>
#include    <string.h>
#include    <windows.h>
typedef struct
{
  char nome[100];
} aux;
aux Maiusc( aux ax )
{
  int i = 0;
  do
  {
    if(ax.nome[i] > 96 && ax.nome[i] < 123 )
      ax.nome[i] -= 32;
    else ax.nome[i] = ' ';
    i++;
  }while( ax.nome[i] != 0 );
  return ax;
}
int main( int Argc, char **Argv )
{
  aux str;
  strcpy(str.nome , "qualquer coisa" );
  str = Maiusc(str);
  printf("retornou => %s\n",str.nome);
  return 0;
}

e minúsculas :

#define     _WIN32_WINNT 0x600
#define     _h GetStdHandle(STD_OUTPUT_HANDLE)
#include    <stdio.h>
#include    <stdlib.h>
#include    <conio.h>
#include    <string.h>
#include    <windows.h>
typedef struct
{
  char nome[100];
} aux;
aux Minusc( aux ax )
{
  printf("Frase OriginaL => %s\n",ax.nome);
  int i = 0;
  do
  {
    if(ax.nome[i] > 64 && ax.nome[i] < 91 )
      ax.nome[i] += 32;
    else if(ax.nome[i] == ' ' )ax.nome[i] = ' ';
    i++;
  }while( ax.nome[i] != 0 );
  return ax;
}
int main( int Argc, char **Argv )
{
  aux str;
  strcpy(str.nome , "ALGUMA COISA e mais coi/sAS" );
  str = Minusc(str);
  printf("retornou ->----=> %s\n",str.nome);
  return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Mr-86    o compilador mostra erros em linhas que nem existe nesse programa , as funções faltam argumentos e o getline não funciona desse modo que você colocou ,  e com o tolower dentro dela então é que não vai funcionar mesmo ,  use o cin >>  , e seu código ficou assim  :

include <iostream>
#include <cstring>
#include <iomanip>
#include <cstddef>
#include <string>
#include <cstdbool>
using namespace std;
using std::string;
void pegaPala(string &palavra, string &palavraresolvida, int &tentativas);
void jogar(string palavra, string , int tentativas);
bool verificar(string palavra, string , char resp);
int main() 
{
    string palavra = "ababa";
    string letrasUsadas = "";
    string palavraresolvida = "12345";
    int tentativas = 3;
    pegaPala(palavra, palavraresolvida, tentativas);
    jogar(palavra, "coisa" , tentativas);
}
void pegaPala(string &palavra, string &palavraresolvida, int &tentativas)
{
    /// abrir um aqui so de leitura, pegar uma palavra aleatoria e mandar para 
    /// a palavra e fazer ja a quantidade de tentivas
    for (int i = 0; i < palavra.size(); i++) 
    {
        palavraresolvida[i] = '_';
    }
    cout << "palavraresolvida= " << palavraresolvida << endl;
}
void jogar(string palavra, string palavraresolvida, int tentativas)
{
    string erros = "";
    char resp = 'l';
    bool veri = false;
    /// colocar uma verificaçao para ver se o jogador acertou todas as letras
    while (tentativas != 0)
    {
        cout << "Letras usadas -----------: " << erros << endl;
        cout << "Tentativas disponiveis --: " << tentativas << "\n" << endl;
        cout << palavraresolvida << "\n" << endl;
        cout << "Digite uma letra --------: ";
        ///getline(cin, tolower(resp));///
        cin >> resp;
        veri = verificar(palavra, "coisa" , resp);
        if ( ! veri ) 
        {
            tentativas--;
            erros = erros + " " + (char)toupper(resp);
        }
    }
    cout << "aqui " << erros << endl;
}
bool verificar(string palavra, string palavraresolvida, char resp)
{
    for (int i = 0; i < palavra.size(); i++) 
    {
        if (palavra[i] == resp)
            palavraresolvida[i] = resp;
        return true;
    }
    return false;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Solução
22 horas atrás, Felipecfk disse:

As vezes a IDE vem 'pelada'

 

12 horas atrás, devair1010 disse:

 o visual studio é uma IDE apropriada para a linguagem c++

 

Sei que é usual e dá pra ver por esses exemplos aqui, mas IDE é masculino. UM IDE, porque IDE é ambiente e ambiente em português é masculino.

 

11 horas atrás, Mr-86 disse:

Agradeço pela ajuda com as strings e o char, nunca tive esse problema quando usava codeblocks. e por isso nunca me deparei com algo assim

 

Code::Blocks  é apenas um ambiente de desenvolvimento, nada mais. Sequer inclui um compilador. Visual Studio é um ambiente gigante muli-linguagem. E não necessariamente inclui um compilador.

 

Não há um "problema" especial. Só está bem errado o que escreveu. 

 

C e C++ são linguagens muito padronizadas, com mais de 50 anos. C++ em especial é controlada por um comitê e em normas publicadas a cada 3 anos. C++23 vai sair em 2023 😄  por exemplo.

 

Visual Studio roda com o compilador da Microsoft e o Code::Blocks com qualquer um inclusive esse. Em geral é instalado com o compilador gcc. 

 

Mas quem define C++ é o padrão iso. Nos últimos anos o compilador da Microsoft tem estado adiante em termos da linguagem do que o gcc ou o clang, os outros compiladores mais comuns para essas linguagens. corotinas e std::format por exemplo estão no compilador da Microsoft há anos e agora em 2023 estão chegando no gcc, se é que roda tudo da linguagem.

 

Um problema comum: o Code::Blocks muitas vezes é instalado com uma versão de gcc de anos e anos atrás e configurado para uma versão de C++ ainda mais antiga, como de 1998. E o C de 1989. E aí os estudantes ficam com a noção de que isso é a linguagem e ficam com a versão de décadas atrás.

 

Não existe o C++ do Code::Blocks e o C++ da Microsoft. Existe C++ como no standard. Há uma pequena liberalidade para implementação por parte dos caras que escrevem os compiladores mas não afeta o nível comum de programas. Muito menos os programas de estudantes.

 

 

Sobre o programa como postou 

 

Declarou esse protótipo

 

	void jogar(string palavra, int tentativas);

 

E escreveu essa função

 

void jogar(
    string palavra, string palavraresolvida, int tentativas)
{
// ...
}

 

E está errado em qualquer plataforma.

 

Declarou

 

	bool verificar(string palavra, char resp);

 

mas escreveu 

 

bool verificar(
    string palavra, string& palavraresolvida, char resp)
{
  //...
}

 

E está claro errado em qualquer caso. 

 

Os protótipos tem menos argumentos que as funções que declarou. C++ tem poliformismo, overloading. Então pode ter várias funções --- o sentido de poli --- com o mesmo nome e argumentos diferentes. Então para o compilador pode estar certo mas para o linker não vai ter a função certa para gerar o código. Apenas corrija isso.

 

O compilador não sabe se você tem a função com DOIS argumentos num outro arquivo então até aí tudo bem. Só que não tem. E aí na fase seguinte de link para gerar o executável não tem a função com 2 argumentos....

 

Veja o primeiro erro de seu programa na visão do compilador...

 

	error C2660: 'jogar': function does not take 2 arguments

 

E o que tem na linha 21

 

    jogar(palavra, tentativas);

 

Só que a única versão de jogar() que você escreveu tem 3 argumentos e não 2.

 

11 horas atrás, Mr-86 disse:

Agradeço pela ajuda com as strings e o char, nunca tive esse problema quando usava codeblocks. e por isso nunca me deparei com algo assim

 

Só está errado. Para o gcc no Code::Blocks ou o CL.exe do Visual Studio, para qualquer versão de C++

 

        getline(cin, tolower(resp));

 

Pois é: getline()  está definida onde??? Não incluiu string. Está errado. Incluiu cstring que é outro bicho.

 

Mais ainda: tivesse você incluído string ainda ia dar erro.

 

Leia o manual.

 

	istream& getline (istream&  is, string& str);

 

Nem precisa na verdade porque Visual Studio mostra a definição: basta deixar o ponteiro do mouse sobre a chamada e ficar olhando...

image.png.534b6b9e60fdd82d4bfff4184a4286f1.png

 

Claro, isso porque tolower() retorna o que? basta apontar...

 

image.png.abfe63633e448da7c9a3627794c5e879.png

 

Retorna um int.

 

Então está escrito aí que getline espera 2 parâmetros nesse caso: um (a) stream e uma referência para string. Você forneceu um int. Não tem isso. Só não deu esse erro porque o IDE sequer achou a definição de geline() já que você também não colocou o #include <string>

 

E note que getline tem outros overloads. Pode ser chamada com 3 parâmetros por exemplo.

 

Acho melhor corrigir esse mínimo e postar o novo código antes de ver os outros erros.

 

 

 

 

  • Curtir 2
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!