Dúvidas em C

1. Dúvidas em C

Gabriel Oliveira da Silva
Gabrielz

(usa Arch Linux)

Enviado em 08/05/2015 - 12:37h

Olá, amigaaaaaas!
Estou com umas dúvidas em C, poderiam me ajudar?

Vamos lá:

1ª Dúvida

#include <stdio.h>
#include <stdlib.h>

int main(void){
printf("Hello VOL World!");
}

Sempre utilizei o "int main()", ou seja, sem parâmetros. Mas, por que em vários sites utilizam como parâmetro o "void"?

2ª Dúvida

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
printf("Hello VOL World!");
}

Por que aqui usei int argc, char *argv[]?

3ª Dúvida
Pra que serve o getch, gets, puts...?

Agradeço encarecidamente às respostas!


  


2. Re: Dúvidas em C

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 08/05/2015 - 18:20h



1ª Dúvida

#include <stdio.h>
#include <stdlib.h>

int main(void){
printf("Hello VOL World!");
}

Sempre utilizei o "int main()", ou seja, sem parâmetros. Mas, por que em vários sites utilizam como parâmetro o "void"?


Em C, significa que pode receber qualquer argumento, com o void, já não.
Já em C++, ele pode assumir que sem argumentos seja void.


2ª Dúvida

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
printf("Hello VOL World!");
}

Por que aqui usei int argc, char *argv[]?


Significa que irá receber argumentos passados ao executar o "executavel", por exemplo:


#include <stdio.h>

int main(int argc, char *argv[]){
printf("Argumentos Recebidos : \n");
int i;
for(i = 0;i<argc;i++){
printf("%s\n",argv[ i ]);
}

return 0;
}


Se salvar como, por exemplo, teste.c e executar assim : ./teste argumento1 argumento2 argumento 3; terá essa saida:

Argumentos Recebidos:
./teste
argumento1
argumento2
argumento
3


Em suma: ArgC = Total de argumentos; ArgV = "Valor" dos argumentos
[/quote]


3ª Dúvida
Pra que serve o getch, gets, puts...?


São funções diferentes:

Getch() é uma função da ConIO (Windows) que pega o caractere digitado sem ter que apertar enter e não aparece na tela.
GetS vem de "Get String", e faz o que o nome sugere: Pega Frase. O utilizo dela não é recomendado pois pode ocorrer overflow de memória e BUMMMM.

Segue um exemplo de como usar uma espécie de gets, mas de uma forma segura:


#include <stdio.h>

int main(int argc, char *argv[]){

char frase[10];

printf("Digite uma frase : ");
fgets(frase,10,stdin);

puts("\nVocê digitou : ");
puts(frase);

return 0;
}


[/quote]
Onde: fgets(frase = o array,10 = a largura do array, stdin = entrada padrao);

Já aproveito e mostro como utilizar o PutS (Colocar Frase; Put String).
Nota: Com ele não é possível utilizar variáveis! Apenas Frases!

Espero ter ajudado

[]'s

T+

EDIT: Corrigido pequenos erros!


3. Re: Dúvidas em C

Gabriel Oliveira da Silva
Gabrielz

(usa Arch Linux)

Enviado em 08/05/2015 - 18:45h

Thihup escreveu:



1ª Dúvida

#include <stdio.h>
#include <stdlib.h>

int main(void){
printf("Hello VOL World!");
}

Sempre utilizei o "int main()", ou seja, sem parâmetros. Mas, por que em vários sites utilizam como parâmetro o "void"?


Em C, significa que pode receber qualquer argumento, com o void, já não.
Já em C++, ele pode assumir que sem argumentos seja void.


2ª Dúvida

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
printf("Hello VOL World!");
}

Por que aqui usei int argc, char *argv[]?


Significa que irá receber argumentos passados ao executar o "executavel", por exemplo:


#include <stdio.h>

int main(int argc, char *argv[]){
printf("Argumentos Recebidos : \n");
int i;
for(i = 0;i<argc;i++){
printf("%s\n",argv);
}

return 0;
}


Se salvar como, por exemplo, [i]teste.c
e executar assim : ./teste argumento1 argumento2 argumento 3; terá essa saida:

./teste
argumento1
argumento2
argumento
3


Em suma: ArgC = Total de argumentos; ArgV = "Valor" dos argumentos



3ª Dúvida
Pra que serve o getch, gets, puts...?


São funções diferentes:

Getch() é uma função da ConIO (Windows) que pega o caractere digitado sem ter que apertar enter e não aparece na tela.
GetS vem de "Get String", e faz o que o nome sujere: Pega Frase. O utilizo dela não é recomendado pois pode ocorrer overflow de memória e BUMMMM.

Segue um exemplo de como usar uma espécie de gets, mas de uma forma segura:


#include <stdio.h>

int main(int argc, char *argv[]){

char frase[10];

printf("Digite uma frase : ");
fgets(frase,10,stdin);

puts("\nVocê digitou : ");
puts(frase);

return 0;
}



Onde: fgets(frase = o array,10 = a largura do array, stdin = entrada padrao);

Já aproveito e mostro como utilizar o PutS (Colocar Frase; Put String).
Nota: Com ele não é possível utilizar variaveis! Apenas Frases!

Espero ter ajudado

[]'s

T+[/quote]


Uau! Agora já sei porque usam esses "puts" e "gets"... existem mais "variantes"? Ainda não entendi a 1ª e 2ª dúvida :(



4. Re: Dúvidas em C

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 08/05/2015 - 18:51h

Sim, existem vários variantes.

Com a relação a dúvida, poderia me "explicar" o que não entendeu? Acho que com a minha explicação já estava clara ):

Me adicione no Skype : thihup

Espero ter ajudado

[]'s

T+


5. Re: Dúvidas em C

Gabriel Oliveira da Silva
Gabrielz

(usa Arch Linux)

Enviado em 08/05/2015 - 19:08h

Thihup escreveu:

Sim, existem vários variantes.

Com a relação a dúvida, poderia me "explicar" o que não entendeu? Acho que com a minha explicação já estava clara ):

Me adicione no Skype : thihup

Espero ter ajudado

[]'s

T+


Não tenho Skype. É uma brincadeira ver o que a Microsoft faz com o Linux...
A respeito da minha dúvida, achei confusa sua explicação. Tem como dar uma explicação "alá faculdade"? -q




6. Re: Dúvidas em C

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 08/05/2015 - 19:18h

Gabrielz escreveu:

Thihup escreveu:

Sim, existem vários variantes.

Com a relação a dúvida, poderia me "explicar" o que não entendeu? Acho que com a minha explicação já estava clara ):

Me adicione no Skype : thihup

Espero ter ajudado

[]'s

T+


Não tenho Skype. É uma brincadeira ver o que a Microsoft faz com o Linux...
A respeito da minha dúvida, achei confusa sua explicação. Tem como dar uma explicação "alá faculdade"? -q



Hum... "Alá faculdade" complica pois nunca fui pra uma (ainda); Só tenho 14 anos!

Deixe-me ver ...

O argc (argument count) é um inteiro e possui o número de argumentos com os quais a função main() foi chamada na linha de comando. Ele é, no mínimo 1, pois o nome do programa é contado como sendo o primeiro argumento.

O argv (argument values) é um ponteiro para uma matriz de strings. Cada string desta matriz é um dos parâmetros da linha de comando. O argv[0] sempre aponta para o nome do programa (que, como já foi dito, é considerado o primeiro argumento). É para saber quantos elementos temos em argv que temos argc.

Eu recomendo utilizar o argc e argv apenas se tiver alguma utilidade no programa, por exemplo, se precisar passar um numero pela linha de comando, fariamos algo assim:


#include <stdio.h>

int main(int argc, char *argv[]){
printf("O Programa possui %d argumentos!\n",argc);
if(argc != 2 ){
printf("Digite : [nomeDoPrograma] [numeroX]\n");
return 1;
}

printf("O numero digitado foi %s\n",argv[1]);
return 0;
}



Já do void, posso explicar algo assim :


int foo(){}// Exemplo
foo(50);// Permitido, pois não dizemos que não pode passar argumentos
// Porem
int foo(void){}
foo(59); // Não Permitido, pois está explicito que não recebe argumentos

Acontece a mesma coisa com o Main!

Espero que tenha ficado claro!

Qualquer dúvida só postar aqui.

Espero ter ajudado

[]'s

T+


7. Re: Dúvidas em C

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 08/05/2015 - 21:59h

Resolvido !? Marque o tópico como Resolvido e clique em Melhor Resposta !

Espero ter ajudado

[]'s

T+


8. ..

Gabriel Bassani Ribieiro
gbassanir

(usa Debian)

Enviado em 09/05/2015 - 00:42h

Boa noite,

Está com duvida ou precisa de uma explicação mais especifica ou mais detalhada?

Att,



9. Re: Dúvidas em C

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 15/06/2015 - 12:41h

Resolvido?

Se sim, clique em resolvido e depois em melhor resposta.

Espero ter ajudado

[]'s

T+

--
http://piadasnerds.com/wp-content/uploads/2011/08/grafico_souProgramador.png


10. Re: Dúvidas em C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 16/06/2015 - 12:12h

Caro Thiago,

Já que você desencavou esse, deixe-me fazer uns comentários.

Thihup escreveu:

Gabrielz escreveu:

Não tenho Skype. É uma brincadeira ver o que a Microsoft faz com o Linux...
A respeito da minha dúvida, achei confusa sua explicação. Tem como dar uma explicação "alá faculdade"? -q


Hum... "Alá faculdade" complica pois nunca fui pra uma (ainda); Só tenho 14 anos!


Na verdade, a coisa é um pouco pior que isso. O autor da pergunta queria que alguém fizesse o trabalho de faculdade dele -- uma coisa que eu considero repugnante, e que em geral a comunidade não recebe muito bem.

Deixe-me ver ...

O argc (argument count) é um inteiro e possui o número de argumentos com os quais a função main() foi chamada na linha de comando. Ele é, no mínimo 1, pois o nome do programa é contado como sendo o primeiro argumento.


Falso. A única garantia sobre o valor de argc é que ele não será negativo. De fato, você mesmo pode conseguir que ele seja zero. O código abaixo, que funciona em sistemas UNIX-like, faz isso.

char *empty_argv[]={NULL};
execv("/caminho/do/programa", empty_argv);


O argv (argument values) é um ponteiro para uma matriz de strings. Cada string desta matriz é um dos parâmetros da linha de comando. O argv[0] sempre aponta para o nome do programa (que, como já foi dito, é considerado o primeiro argumento). É para saber quantos elementos temos em argv que temos argc.


Quase tudo OK aqui. A ressalva é que argc pode ser nulo e, nesse caso, argv[0] não contém o nome do programa.

Existe ainda um outro caso excepcional; mas previsto no padrão e possível: se o nome do programa não puder ser determinado, mas argc for maior do que zero, argv[0] aponta para uma string vazia (i.e. argv[0][0]==0). Isso seria possível de conseguir com o seguinte código, por exemplo.

/*
Chamo um programa que soma dois inteiros, mas não informo
ao programa seu próprio nome através do vetor de argumentos.
*/
char *some_argv[]={"", "1", "2", NULL};
execv("/caminho/do/somador", some_argv);


No entanto, a forma usual -- e mais educada -- de fazer seria mesmo informando o nome, de uma das formas abaixo (sendo que a segunda ainda é melhor que a primeira).

char progname[]="/caminho/do/programa";
char *some_argv[N_ARGS+2];
/*
Poderia tamber ser **some_argv, e depois
“some_argv=malloc((N_ARGS+2)*sizeof *some_argv)“
*/

some_argv[0]=progname;
some_argv[1]=arg_1;
some_argv[2]=arg_2;
/* ... */
some_argv[N_ARGS]=arg_n;
some_argv[N_ARGS+1]=NULL;

execv(progname, some_argv);


/*
Igual ao código acima, trocando apenas a atribuição de some_argv[0],
de modo a eliminar a informação de caminho, deixando apenas o nome
do programa.
*/

char *p=strrchr(progname, '/'); /* No Windows seria '\\' em lugar de '/'. */
some_argv[0]=(p? p+1: progname);



11. Re: Dúvidas em C

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 16/06/2015 - 12:28h

paulo1205 escreveu:

Caro Thiago,

Já que você desencavou esse, deixe-me fazer uns comentários.

Thihup escreveu:

Gabrielz escreveu:

Não tenho Skype. É uma brincadeira ver o que a Microsoft faz com o Linux...
A respeito da minha dúvida, achei confusa sua explicação. Tem como dar uma explicação "alá faculdade"? -q


Hum... "Alá faculdade" complica pois nunca fui pra uma (ainda); Só tenho 14 anos!


Na verdade, a coisa é um pouco pior que isso. O autor da pergunta queria que alguém fizesse o trabalho de faculdade dele -- uma coisa que eu considero repugnante, e que em geral a comunidade não recebe muito bem.

Deixe-me ver ...

O argc (argument count) é um inteiro e possui o número de argumentos com os quais a função main() foi chamada na linha de comando. Ele é, no mínimo 1, pois o nome do programa é contado como sendo o primeiro argumento.


Falso. A única garantia sobre o valor de argc é que ele não será negativo. De fato, você mesmo pode conseguir que ele seja zero. O código abaixo, que funciona em sistemas UNIX-like, faz isso.

char *empty_argv[]={NULL};
execv("/caminho/do/programa", empty_argv);


O argv (argument values) é um ponteiro para uma matriz de strings. Cada string desta matriz é um dos parâmetros da linha de comando. O argv[0] sempre aponta para o nome do programa (que, como já foi dito, é considerado o primeiro argumento). É para saber quantos elementos temos em argv que temos argc.


Quase tudo OK aqui. A ressalva é que argc pode ser nulo e, nesse caso, argv[0] não contém o nome do programa.

Existe ainda um outro caso excepcional; mas previsto no padrão e possível: se o nome do programa não puder ser determinado, mas argc for maior do que zero, argv[0] aponta para uma string vazia (i.e. argv[0][0]==0). Isso seria possível de conseguir com o seguinte código, por exemplo.

/*
Chamo um programa que soma dois inteiros, mas não informo
ao programa seu próprio nome através do vetor de argumentos.
*/
char *some_argv[]={"", "1", "2", NULL};
execv("/caminho/do/somador", some_argv);


No entanto, a forma usual -- e mais educada -- de fazer seria mesmo informando o nome, de uma das formas abaixo (sendo que a segunda ainda é melhor que a primeira).

char progname[]="/caminho/do/programa";
char *some_argv[N_ARGS+2];
/*
Poderia tamber ser **some_argv, e depois
“some_argv=malloc((N_ARGS+2)*sizeof *some_argv)“
*/

some_argv[0]=progname;
some_argv[1]=arg_1;
some_argv[2]=arg_2;
/* ... */
some_argv[N_ARGS]=arg_n;
some_argv[N_ARGS+1]=NULL;

execv(progname, some_argv);


/*
Igual ao código acima, trocando apenas a atribuição de some_argv[0],
de modo a eliminar a informação de caminho, deixando apenas o nome
do programa.
*/

char *p=strrchr(progname, '/'); /* No Windows seria '\\' em lugar de '/'. */
some_argv[0]=(p? p+1: progname);


Valeu Paulo.

Não comento mais esse(s) erro(s).

Muito Obrigado

[]'s

T+

--
http://piadasnerds.com/wp-content/uploads/2011/08/grafico_souProgramador.png






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts