Dúvida (básica?) em C++

Fito

Power Member
Pessoal entrei para a Universidade e tou a ter uma cadeira de Programação em C++. O problema é que eu não percebo lá muito disto.

Estou aqui a (tentar) programar mas isto não me está a sair muito bem.

O programa é simples e já o devem ter visto. É aquele em que inserimos o nome e ele depois diz: "Benvindo ao mundo do C++, Techzoner!".

Ora aqui vai o algorítmo do programa:
Código:
#include <iostream>
#include <string>

using namespace std;

int main ()

{
    cout << "Insira o seu nome: ";
    string nome;
    cin >> nome;
    cout << "Benvindo ao mundo do C++," << nome << "!\n";
}
Ora, o meu problema é que quando carrego no enter depois de já ter posto o meu nome, o programa desaparece. Alguém sabe porquê?

Obrigado a todos.
 
Última edição pelo moderador:
Porque está a dizer a mensagem que queres que apareca e a apaga-la muito rapido, por isso nem chegas a ver.

Para veres a mensagem sem estares a adicionar mas linhas de código, comeca a correr todos os teus programas atraves da linha de comandos.

Compila o programa, vai à linha de comandos e corre-o. Vais ver que já funciona sem desaparecer..
 
Eu estou a utilizar o Microsoft Visual C++ 2008 (foi recomendado pelo prof). E acho que estou a seguir tudo o que ele disse para fazer mas não consigo correr o programa. Eu quando faço Start Without Debugging aparece o cmd (fundo preto) e é aí que supostamente o programa devia correr...
 
Não uses o system("PAUSE"); que isso torna-te dependente do SO.
Usa antes isto no fim da main:

Código:
cin.get();

E não te esqueças de colocar return 0 como última instrução (uma vez que a main devolve um int).
 
Faz no final um system("pause")

Já funcionou com esse comando (obrigado).

Mas incomoda-me o facto do algoritmo do stor estar igualzinho ao meu (sem este comando do pause) e isto não funcionar... (e não, o stor não se enganou).

Não será alguma definição do programa que me estará a causar isto?
 
Isso funciona, mas como estás a correr o programa a partir do IDE, ele abre e fecha logo. Se o corresses a partir da linha de comandos isso já não acontecia.
 
Não é mesmo assim. O programa finaliza se não tiver nada para o parar.
Se o executares a pata, isto é, chamas a linha de comandos a mão e lá chamas o executável que fizeste do teu programa, ai já vais ver o resultado aparecer.
 
Ok, percebi.

Agradeço a vossa ajuda e paciência :)

De qualquer das formas amanhã vou ter aula e o melhor que tenho a fazer é levar o portátil para ele me explicar isso tudo.

Mais uma vez, obrigado.
 
Eh pá, quando o programa termina, o Windows fecha logo a janela. É só isso!
O programa escreve e logo a seguir termina, portanto não chegas a ver o que ele escreveu. Normalíssimo, está correcto.

Mas tens um erro no teu programa: a função main não devolve nenhum valor e é obrigatório que o faça. Tens de acrescentar:

Código:
  ...
  return 0;
}
 
Eh pá, quando o programa termina, o Windows fecha logo a janela. É só isso!
O programa escreve e logo a seguir termina, portanto não chegas a ver o que ele escreveu. Normalíssimo, está correcto.

Mas tens um erro no teu programa: a função main não devolve nenhum valor e é obrigatório que o faça. Tens de acrescentar:

Código:
  ...
  return 0;
}

x2
 
eu apenas li os outros posts em Z nao sei se ja tens a soluçao mas aqui fica uma:
(nao consegui usar o tipo string por isso apaguei o #include <string> no entanto aqui fica uma versao)

#include <iostream>

using namespace std;

int main (){

cout << "Insira o seu nome: ";
char nome[16]; //declarei q o nome so pode ter ate 16 caracteres
cin >> nome;
cout << "Benvindo ao mundo do C++," << nome << "!\n";

// agora tens esta opçao:

system("PAUSE");
return EXIT_SUCCESS;

// ou esta:

getchar();
getchar();

//
}
 
Ó tiagozh, o teu conselho para usar o char [16] não é muito bom. E se o utilizador escrever mais do que 15 caracteres?

Nesse caso, de acordo com o padrão da linguagem, o comportamento do programa é indefinido (undefined behaviour). Na prática, o que vai acontecer na maioria das plataformas é que à medida que o utilizador vai pondo mais caracteres estes vão sendo escritos por cima daquilo que vem a seguir no stack.

Neste caso, aquilo que vem a seguir é primeiro o endereço na pilha da moldura de stack da função que chamou o main(), se este for corrompido, quando o main retornar, essa função vai ter as suas variáveis locais todas maradas. Aquilo que vem a seguir depois é o endereço de retorno da função main(), se este for corrompido, o main vai retornar para um sítio à maluca algures na memória. Ou seja, experimenta no teu programa dar-lhe mais de 15 caracteres para ver o que acontece, podes seguir no debugger, é instrutivo.

Ou seja, usa uma std::string.

Quanto ao system("pause") isto é programar em estilo MS-DOS, é executar o cmd.exe e dizer para ele fazer o comando pause. Isto é completamente inadequado nos dias de hoje.

Quanto ao getchar(), ele não existe no padrão da linguagem, também é um arcaísmo do tempo do MS-DOS. De qualquer modo, é preferível ao system("pause") que implica criar um processo e executar o cmd.exe só para esperar uma tecla.

Há duas soluções: ou apenas se usa coisas do C++ padrão, e então usa-se a solução que outros já apontaram (cin >> qq_coisa), ou então, se assumimos a dependência do Windows, usamos as funções de consola do Windows directamente (AllocConsole, FreeConsole, ReadConsoleInput).
 
tens razao bsd mas eu nao consegui usar a string. . . mas existe uma funcao acho qe é a malloc() ou algo assim qe pode mudar o valor do array conforme a necessidade. . . mas nunca tive essa necessidade. . .

e quanto ao getchar() e ao system("pause"), eu pessoalmente uso o getchar() é-me mais facil de utilizar, mas o cin<<qlqr coisa tambem é bem pensado, mas para quem trabalha em dev c++ pode usar o return ja q o dev nao deixa com q o main seja void.

 
tens razao bsd mas eu nao consegui usar a string. . .

É exactamente como escreveram no primeiro post. De qualquer modo, é fundamental quando se está a programar ter uma referência da linguagem à mão. Ninguém sabe todas as funções de cor, por muita experiência que tenha.

mas existe uma funcao acho qe é a malloc() ou algo assim qe pode mudar o valor do array conforme a necessidade. . . mas nunca tive essa necessidade. . .[/quote ]

O malloc() não te permite alterar a dimensão do array conforme a necessidade. A diferença entre fazer int array[16]; e int* array = (int*) malloc(16 * sizeof(int)); é que no primeiro caso a dimensão do array tem de ser conhecida em tempo-de-compilação (compile time), enquanto no segundo caso, a dimensão do array só precisa de ser conhecida em tempo-de-execução (run time). Também se chama um array estático ao primeiro e dinâmico ao segundo.

No entanto, alterar a dimensão de um array alocado com malloc() implica usar a função realloc e é muito ineficiente. Se eu prevejo ter uma sequência cujo comprimento vai ser alterado frequentemente, então devo usar uma lista ligada e não um array.

Depois, malloc() é uma herança do C. Em C++ só se usa malloc() quando estamos a misturar com código C. Usa-se é os operadores new e delete.

Tens de decidir um pouco melhor se estás a aprender C++ ou se é C. Embora seja possível escrever um programa que é válido em C e em C++, são linguagens muito diferentes, com maneiras muito diferentes de fazer as coisas.

Se é C++ que estás a aprender então a tua aprendizagem deve orientar-se assim: primeiro saber utilizar a string e os contentores padrão vector, list, deque e os associativos set e map e aprender os fundamentos da programação com estes elementos; depois aprender a usar os operadores new e delete e com os smart pointers auto_ptr, shared_ptr que terão mais a ver com a organização de programas mais complicados; só depois aprender o malloc()/realloc()/free() como uma forma de interoperar com código C.

mas para quem trabalha em dev c++ pode usar o return ja q o dev nao deixa com q o main seja void.

Já se tinha dito aqui, o padrão do C++ exije que o main devolva int.

A propósito, para usar o EXIT_SUCCESS, como usaram acima é preciso incluir o <cstdlib>. Não é mais correcto devolver EXIT_SUCCESS do que 0. O padrão da linguagem define que o efeito de sair com código EXIT_SUCCESS ou 0 é o mesmo, isto é, que o programa deve sair com algum código de sucesso dependente do SO. Para um código de falha é que é necessário usar EXIT_FAILURE.
 
Back
Topo