ARGC e ARGV ( Varias Duvidas )

1. ARGC e ARGV ( Varias Duvidas )

Lucas
~lujjc4

(usa Ubuntu)

Enviado em 06/02/2012 - 09:06h

Olá, tenho várias duvidas em relação a utilização do ARGC e ARGV ..
ja pesquisei em varios lugares mais nao encontrei a resposta para as minhas perguntas..

Várias delas são referentes ao codigo a seguir:


#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int mes;
char *nome_mes [] = {"Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho","Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"};
if(argc == 4) /* Testa se o numero de parâmetros fornecidos está correcto, o primeiro parâmetro é o nome do programa, o segundo o dia, o terceiro o mes e o quarto os dois últimos algarismos do ano */
{
mes = atoi(argv[2]); /* argv contem strings.A string referente ao mes deve ser transformada em um numero inteiro. A funcao atoi esta sendo usada para isto: recebe a string e transforma no inteiro equivalente */
if (mes<1 || mes>12) /* Testa se o mes e' valido */
printf("Erro!\nUso: data dia mes ano, todos inteiros");
else
printf("\n%s de %s de 19%s", argv[1], nome_mes[mes-1], argv[3]);
}
else printf("Erro!\nUso: data dia mes ano, todos inteiros");
}


Duvidas:

1º) Onde e como é feita a leitura(entrada de dados) para o argc&argv.. é ultilizado Scanf? Arquivo .txt?
2º) Em relação a o ponteiro para uma matriz de Strings *argv[].. para onde este ponteiro realmente aponta? que matriz seria essa? algum local indefinido na memoria :@ ?
3º) Em relação ao code na declaração das variáveis existe um ponteiro *nome_mes[] que reçebe os respectivos dias do mês.. mais para onde esse ponteiro aponta? eu pensei que usar ponteiros sem aponta-lo para algum lugar não seria uma coisa tão legal..
4º) No primeiro else do code é utilizado nome_mes[mes-1] para especificar o mes.. mais o nome_mes é um ponteiro nao deveria ser *nome_mes[mes-1] ou nao tem nenhum problema em relação a isso?


Se possivel postem exemplos e links ficarei bastante grato ^^
Agradeço desde já :]

Bom Dia!!
[]'s


  


2. Re: ARGC e ARGV ( Varias Duvidas )

euteste da silva
foxbit3r

(usa Solaris)

Enviado em 06/02/2012 - 09:47h

Se vc já pesquisou e não está encontrado resposta, vc precisa mudar de fonte de pesquisa.

O argc e argv ser para passar argumento via linha de comando.
Um exemplo isso é o comando ls.

Por exemplo:

ls argumento1 argumento2 argumento3 ...

No caso abaixo o "-l" tmb é um argumento.

ls -l argumento1 argumento2 argumento3

Abaixo um exemplo do argv e argc.

argv[0] = ls
argv[1] = "-ltr"
arvg[2] = "nome_do_arquivo"
argc vai possuir o valor 2.

ls -ltr nome_do_arquivo

Compre um livro da linguagem C que vc vai aprender, se não quiser comprar procure um numa biblioteca.



3. Re: ARGC e ARGV ( Varias Duvidas )

Paulo
paulo1205

(usa Ubuntu)

Enviado em 24/02/2012 - 19:36h

1º) Onde e como é feita a leitura(entrada de dados) para o argc&argv.. é ultilizado Scanf? Arquivo .txt?


O sistema operacional, ao carregar um programa na memória para iniciar sua execução, reserva uma área de memória e coloca nela os argumentos passados ao programa (leia sobre a chamada execve()).


2º) Em relação a o ponteiro para uma matriz de Strings *argv[].. para onde este ponteiro realmente aponta? que matriz seria essa? algum local indefinido na memoria :@ ?


Cuidado com os nomes: formalmente falando, C não tem strings propriamente ditas. Nem matrizes.

Na declaração
char *argv[] 

o símbolo argv denota um "array de ponteiros para caracteres" (algumas pessoas traduzem "array" como "vetor").

Como C não tem strings como tipo específico, usa-se a convenção de representar strings como uma sequência contígua de caracteres que tem, ao final, um byte com valor nulo, e o acesso a tal sequência de caracteres é dado por um ponteiro que aponta para o primeiro caráter da sequência.

Desse modo, argv fica sendo um array em que cada elemento contém o endereço de uma posição de memória na qual o sistema operacional dispôs o primeiro caráter dos argumentos passados à chamada execve() que disparou a execução do programa.


3º) Em relação ao code na declaração das variáveis existe um ponteiro *nome_mes[] que reçebe os respectivos dias do mês.. mais para onde esse ponteiro aponta? eu pensei que usar ponteiros sem aponta-lo para algum lugar não seria uma coisa tão legal..


Cada elemento do array nome_mes é um ponteiro que aponta para a posição na memória do primeiro caráter do nome do respectivo mês.


4º) No primeiro else do code é utilizado nome_mes[mes-1] para especificar o mes.. mais o nome_mes é um ponteiro nao deveria ser *nome_mes[mes-1] ou nao tem nenhum problema em relação a isso?


Se você fizesse isso, deixaria de ter um ponteiro para o primeiro caráter (que é a notação para acesso à sequência de caracteres da string convencionada) e passaria a ter o próprio primeiro caráter.

Pense da seguinte forma: o operador unário "*" pode ser lido exatamente como "conteúdo da posição de memória". Desse modo, do mesmo modo como a declaração
int i; 

pode ser lida como "i é do tipo int", uma declaração tal como
int *ptr_int; 

pode ser lida como a informar que "o conteúdo da posição de memória ptr_int é do tipo int".

O mesmo sentido ocorre em expressões em que o ponteiro aparece precedido pelo operador "*". Usando os mesmos nomes dos exemplos acima, as expressões
a = 5 * i;
b = 5 * *ptr_int;

podem ser lidas, respectivamente, como "a recebe 5 vezes o valor de i" e "b recebe 5 vezes o valor do conteúdo da posição de memória ptr_int".






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts