none
Problemas com Constante RRS feed

  • Pergunta

  • Estou com alguns erros no meu código que não estou conseguindo solucionar. Um deles é referente a constante, pesquisei no Google e em vários lugares e só encontrei outras pessoas com o mesmo problema e a mesma dúvida em relação ao uso de constantes como o meu caso e acho que esse mau uso deve está ocasionando erros no MessageBox. Essa constante não pode ser mudada para uma outra variável, tem que ser sempre constante.

    Alguém poderia me ajudar nesse problema?

     

    #include <windows>
    #include <string>
    #include "stdafx.h"

     

    const char * NOME = "William";

     

    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {

     char * strString[256]=" Souza";
     
     strcat(strString,NOME);

     MessageBox(GetActiveWindow(),strString, "Título", MB_OK | MB_ICONWARNING);

     

     return 0;
    }

     

    segunda-feira, 6 de outubro de 2008 13:07

Respostas

  • Olá William,

     

    Na verdade, a strcat vai começar a partir do primeiro terminador que encontrar, e vai substituí-lo pelo primeiro caracter da string que você quer concatenar. Os arrays começam do índice 0 (zero), portanto o "M" está na posição 6, e o terminador na posição 7:

     

    0 1 2 3 4 5 6 7
    W i l l i a m \0

     

    Abraços,

    Caio Proiete




    Caio Proiete
    http://www.caioproiete.com
    quinta-feira, 9 de outubro de 2008 12:58
  • Olá William,

     

    Todos os livros que eu e o Ari indicamos, falam sobre ponteiros, por isso é só escolher.

     

    Se você não tiver problemas em ler livros em Inglês, o livro que o Ari indicou é realmente muito bom. Se prefere em Português, acho que o da Deitel é melhor para começar.

     

    Abraços,
    Caio Proiete




    Caio Proiete
    http://www.caioproiete.com
    quinta-feira, 9 de outubro de 2008 13:34
  •  

    Vou pesquisar o melhor para eu trabalhar.

     

    Obrigado pessoal!!

    quinta-feira, 9 de outubro de 2008 13:39

Todas as Respostas

  • Ola William,

     

    Seria mais fácil ajudar se você mostrasse qual é a mensagem de erro que está ocorrendo.

     

    De qualquer forma, a sua variável strString está sendo declarada no stack, com um valor fixo... Não deveria ter o "*", e você devria copiar o conteúdo primeiro, antes de concatenar.

     

    Se o seu objetivo é formar o nome "William Souza" na variável strString, creio que seria algo assim:

     

    Code Snippet

     

     // Declara a variável na pilha, com espaço de 256 bytes...

     char strString[256];

     

     // Copia o "William" para a variável strString

     strcpy(strString, NOME);

     

     // Concatena o " Souza" na variável strString

     strcat(strString, " Souza");

     

     // Mostra a mensagem na tela...

     MessageBoxA(GetActiveWindow(), strString, "Título", MB_OK | MB_ICONWARNING);

     

     

     

    Finalmente, desculpe insistir na mesma questão, mas acho que você deveria ler alguns livros sobre programação com C++ antes de realmente começar a tentar programar sem ter uma base.

     

    Se você estiver em São Paulo, recomendo fortemente o curso de C++ da Agit (http://www.agit.com.br), que é excelente!!

     

    Abraços,

    Caio Proiete




    Caio Proiete
    http://www.caioproiete.com
    segunda-feira, 6 de outubro de 2008 13:49
  • Obrigado Caio, é isso mesmo que eu estava querendo. Eu moro em Brasília aqui é difícil encontrar esse curso, eu encontrei um em 2006 e fiz bem básico, quero fazer outro e enquanto não acho estou tentando estudar com o que tenho. Mas tem casos como esse que não é fácil encontrar como por exemplo saber que tem que copiar alguma coisa primeiro para a variável. Tem detalhes assim que aprendemos pesquisando e nem em curso vai ensinar tudo por mais que seja bom.

    Queria saber por que tem que copiar primeiro o conteúdo e se é assim em todos os casos e quando se declara no stack a variável se comporta como uma CONSTANTE?

     

    Agradeço pela ajuda cara!!

    terça-feira, 7 de outubro de 2008 20:40
  • Olá William,

     

    Em realidade, isso não tem relação com o fato de ser ou não constante...

     

    No C++, as strings possuem um caracter "terminador" que indica quando a string acabou... O caracter "\0".

    Para exemplificar, imagine que você tem a seguinte variável:

     

    Code Snippet

     

     char nome[20];

     

     

    A variável nome é um array do tipo char, com 20 posições - Tem espaço para 20 caracteres.

    Como você precisa do "terminador", isso significa que você deve inserir apenas 19 caracteres... O último deve ficar "reservado" para o terminador.

     

     A diferença entre o strcpy e o strcat é justamente o índice a partir de onde ele coloca a string. A strcpy, vai colocar a string a partir do índice zero, e vai adicionar o terminador, já a strcat copia a string a partir do primeiro terminador zero em diante, e adiciona um novo terminador zero:

     

    Code Snippet

     

     char nome[20];

     strcpy(nome, "William");

     

     

    A variável nome, agora está assim na memória:

    Code Snippet

     

     W, i, l, l, i, a, m, \0, x, x, x, x, x, x, x, x, x, x, x, x

     

     

    Copiou a string William e adicionou o terminador "\0". O restante é espaço livre, que você ainda não está utilizando.

     

    Se agora você fizer um strcat, ele vai começar a partir da posição 7, que é onde está o terminador, vai copiar a string, e adicionar um novo terminador... Continuando o exemplo:

     

    Code Snippet

     

     strcat(nome, " Souza");

     

     

    Com a concatenação, ele copiou o " Souza" a partir do terminador (substituindo-o), a colocou outro terminador no final do " Souza". Agora, a variável nome, está assim na memória:

     

    Code Snippet

     

     W, i, l, l, i, a, m,  , S, o, u, z, a, \0, x, x, x, x, x, x

     

     

    Entendeu?

     

    Abraços,

    Caio Proiete




    Caio Proiete
    http://www.caioproiete.com
    terça-feira, 7 de outubro de 2008 22:53
  • William,

     

    Aproveitando o tópico, gostaria de indicar dois livros muito bons que, com certeza,  te dariam uma base bem legal e você pode comprar no Submarino, e receber em casa:

     

    C++: Como Programar da Deitel

     

    Treinamento em Linguagem C++ da Viviane Victorine

     

    Abraços,
    Caio Proiete




    Caio Proiete
    http://www.caioproiete.com
    terça-feira, 7 de outubro de 2008 22:58
  • William,

     

    Só complementando o que o Caio escreveu, o terminador indicador de final de string na verdade é '\0' e não '0'. Uma outra dica de um outro livro muito bom é do Jesse Liberty (um autor que gosto muito) chamado "Teach Yourself C++ in 21 Days".

     

    http://www.amazon.com/Sams-Teach-Yourself-Days-5th/dp/0672327112/ref=sr_11_1?ie=UTF8&qid=1223426541&sr=11-1

     

    Att.

     

    Ari

     

     

     

     

     

    quarta-feira, 8 de outubro de 2008 00:43
  • Caio a explicação foi muito boa, muito boa mesmo.

     

    Eu fiquei só com umas dúvidas, quando se faz a concatenação a posição do terminador anterior vai ficar sempre livre e a outra string no caso do exemplo acime vai começar na posição 9? Você informou a posição 7 nessa posição não seria a letra "M"? Não entendi essa parte.

     

    quinta-feira, 9 de outubro de 2008 12:37
  • Olá William,

     

    Na verdade, a strcat vai começar a partir do primeiro terminador que encontrar, e vai substituí-lo pelo primeiro caracter da string que você quer concatenar. Os arrays começam do índice 0 (zero), portanto o "M" está na posição 6, e o terminador na posição 7:

     

    0 1 2 3 4 5 6 7
    W i l l i a m \0

     

    Abraços,

    Caio Proiete




    Caio Proiete
    http://www.caioproiete.com
    quinta-feira, 9 de outubro de 2008 12:58
  • Obrigado Caio e Ari, vou olhar os livros que você me indicaram. Agora entendi legal sobre o terminador.

    Vocês sabem onde encontro algum conteúdo bom sobre ponteiros tenho dificuldades também em ponteiros.

     

    quinta-feira, 9 de outubro de 2008 13:26
  • Olá William,

     

    Todos os livros que eu e o Ari indicamos, falam sobre ponteiros, por isso é só escolher.

     

    Se você não tiver problemas em ler livros em Inglês, o livro que o Ari indicou é realmente muito bom. Se prefere em Português, acho que o da Deitel é melhor para começar.

     

    Abraços,
    Caio Proiete




    Caio Proiete
    http://www.caioproiete.com
    quinta-feira, 9 de outubro de 2008 13:34
  •  

    Vou pesquisar o melhor para eu trabalhar.

     

    Obrigado pessoal!!

    quinta-feira, 9 de outubro de 2008 13:39