Usuário com melhor resposta
Problemas com Constante

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;
}
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 -
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 -
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 -
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!!
-
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 Snippetchar 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 Snippetchar nome[20];
strcpy(nome, "William");
A variável nome, agora está assim na memória:
Code SnippetW, 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 Snippetstrcat(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 SnippetW, 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 -
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:
Treinamento em Linguagem C++ da Viviane Victorine
Abraços,
Caio Proiete
Caio Proiete
http://www.caioproiete.com -
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".
Att.
Ari
-
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.
-
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 -
-
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 -