Jump to content

estrutura (struct)


russo12
 Share

Recommended Posts

é que eu sou novo nisto mas o código que fiz foi este:

#include <iostream>
#include <stdio.h>
using namespace std;
int main () 
{
struct tipo_endereco {
	char rua [20];
	char cidade [20];
	int n_porta;
}p1, p2, p3;
p1.n_porta = 0;
cout << "Escreva o nome de uma rua: ";
gets (p1.rua)'\n';
cout << "Escreva o nome de uma cidade: ";
gets (p2.cidade)'\n';
cout << "Escreva o numero da porta: ";
gets (p3.n_porta)'\n';
system("pause");
}

não percebo disto, o problema é que dá-me erro é na parte quando mando escrever o nº da porta e bloqueia-me a consola

Link to comment
Share on other sites

Boas,

Isso no Visual Studio já dá uma carrada de erros porque estás a meter new lines no gets, está a usar o gets também para obter um inteiro quando o gets é para strings. usa cin >> p1.n_porta.

Outra coisa, porque fazes para cada p1 um campo? Não há necessidade de criares um p para cada campo...

Isto é de âmbito escolar ou pessoal? Se escolar, convém ler a teoria também.

Aqui está o programa, aconselho-te a rever os conceitos básicos do cout, cin e gets.

#include <iostream>
#include <stdio.h>
using namespace std;
int main () {
   struct morada {
      char rua [20];
      char cidade [20];
      int  porta;
   }p;
   // Obter dados
   cout << "Nome da Rua: ";
   gets (p.rua); // uso do gets para obter string com espaços
   cout << "Nome da cidade: ";
   gets (p.cidade); // uso do gets para obter string com espaços
   cout << "Numero da Porta: ";
   cin >> p.porta; // uso do cin porque é um inteiro
}

Nota do moderador: atenção ao fornecimento de código que resolva integralmente os problemas escolares (ou não) dos utilizadores. É uma prática desaconselhada porque, na maioria dois casos, não ajuda a compreender o problema, embora seja a maneira mais fácil de responder.

Link to comment
Share on other sites

Os tipos de dados definidos pelo programador definem-se sempre fora da função main. Logo, a 1ª alteração que tens de fazer é mover a definição da struct para fora da main.

A 2ª alteração que tens de fazer é no cabeçalho da função main. Este apenas pode ter 2 formas:

int main(void) //não recebe valores via linha de comandos

ou

int main(int argc, char** argv) //recebe valores via linha de comandos

Neste caso, como não estás a passar nenhum argumento aquando da invocação do programa, deverás optar pela 1ª forma sugerida.

A 3ª alteração que tens de fazer apagar aquele p1, p2, p3, e colocá-los na main da seguinte forma:

struct tipo_endereco p1, p2, p3;

Assim, estás a indicar que crias 3 structs (p1, p2 e p3) do tipo tipo_endereco. Para escreveres este código de forma mais económica, podes usar um typedef, que basicamente indica a criação de um novo tipo de dados:

typedef struct tipo_endereco {
      char rua [20];
      char cidade [20];
      int n_porta;
} TipoEndereco;

Assim, podes referenciar structs deste tipo da seguinte forma:

TipoEndereco p1, p2, p3;

Outra alteração que tens de fazer é deixar de usar a função gets para ler o que quer que seja. Isto deve-se ao facto de esta função não ter controlo qualquer sobre o tamanho do input lido, podendo gerar facilmente buffer overflows. Para contornar este problema podes usar 1 de 2 funções:

- scanf, indicando nesta o tamanho do input a ser lido:

scanf("%20[^\n]",str); //lê no máximo 20 caracteres para uma string ou, caso o input seja menor que 20, lê até encontrar um '\n' que indica mudança de linha

- fgets que, sendo semelhante à gets, suporta controlo do tamanho do input:

fgets(str,sizeof(str),stdin); //lê do teclado (stdin) input que vai guardar na string str, cujo tamanho é dado por sizeof(str)

Como estás a usar uma mistura de C com C++ (estás a usar o cout para imprimir texto), talvez queiras considerar o uso de funções de leitura de C++, através do cin.

Também tens de alterar a forma como lês o valor da porta, uma vez que é um valor inteiro, e estás a ler como se fosse uma string.

Por fim, deves retirar o system("PAUSE") e substituir por getchar() (em C) ou cin.get() (em C++), uma vez que essa instrução torna o teu código dependente do SO onde executa.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.