Use o botão abaixo para reportar erros ou dar sugestões.

Computação Científica - Um Livro Colaborativo

6.4 Passagem de parâmetros na linha de comando


A função main pode receber strings que são passadas na linha de comando. Usamos a linha

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

onde argc é um inteiro que indica a quantidade de argumentos passados e argv é um vetor contendo todas as strings.

Exemplo 6.4.1. Vamos implementar um código que entra com um nome e um sobrenome na linha de comando e imprime-os.

#include <stdio.h>  
 
int main(int argc, char *argv[])  
{  
printf("número de entradas=%d\n",argc);  
printf("executável=%s\n",argv[0]);  
printf("nome=%s\n",argv[1]);  
printf("sobrenome=%s\n",argv[2]);  
}

Esse programa é executado com uma linha de comando da forma

./a.out Artur Avila

e o resultado é

número de entradas=3  
executável=./a.out  
nome=Artur  
sobrenome=Avila

Observações sobre o exemplo 6.4.1:

1.
O números de entradas é 3 e não 2 (argc tem valor 3).
2.
argv[0] armazena o executável.
3.
O valor argc não entra explicitamente na linha de comando, mas é calculado na execução.

Algumas vezes entramos com strings contendo números e desejamos convertê-los para inteiros. Nesse caso, usamos a função int atoi(char *str) da biblioteca <stdlib>.

Exemplo 6.4.2. Implemente um programa que entre com dois números inteiros e retorna a soma.

#include <stdio.h>  
#include <stdlib.h>  
 
int main(int argc, char *argv[])  
{  
int i,soma;  
for (i=1;i<argc;i++) soma+=atoi(argv[i]);  
printf("soma=%d\n",soma);  
}

Se desejamos entrar com números racionais, trocamos atoi por atof. Observe a versão do código do exemplo 6.4.2 usando números racionais:

#include <stdio.h>  
#include <stdlib.h>  
 
int main(int argc, char *argv[])  
{  
int i;  
double soma;  
for (i=1;i<argc;i++) soma+=atof(argv[i]);  
printf("soma=%f\n",soma);  
}

Exemplo 6.4.3. Implemente uma rotina para calcular a raíz de uma função pelo método de Newton passando o chute inicial e a tolerância na linha de comando e retornando a solução e o número de iterações necessárias (refazendo o exemplo 6.2.2, mas agora passando informações na linha de comando).

#include <stdio.h>  
#include <math.h>  
#include <stdlib.h>  
 
double f(double x)  
{  
  return cos(x)-x;  
}  
double df(double x)  
{  
  return -sin(x)-1.;  
}  
 
void Newton(double x0, double tol, double *xn, int *k)  
{  
  double dif;  
  *k=0;  
  do  
  {  
  (*k)++;  
  *xn=x0-f(x0)/df(x0);  
  dif=fabs(*xn-x0);  
  x0=*xn;  
  }while (dif>tol);  
}  
 
 
int main(int argc, char **argv)  
{  
  double x0,xn,tol;  
  x0=atof(argv[1]);  
  tol=atof(argv[2]);  
  int k;  
  Newton(x0,tol,&xn,&k);  
  printf("Sol=%f, iterações=%d\n",xn,k);  
}

Experimente alguns chutes iniciais e tolerâncias tais como

./a.out 1 1e-10

Nesse último programa usamos **argv em vez de *argv[]. De fato, as notações são equivalentes. Como discutido anteriormente, ** representa ponteiro de ponteiro. Especificamente aqui, temos um ponteiro que aponta para a lista de argumentos e cada um dos argumentos são strings representadas por seus ponteiros.

Creative Commons License Este texto é disponibilizado nos termos da licença Creative Commons Atribuição-CompartilhaIgual 3.0 Não Adaptada (CC-BY-SA 3.0). Página gerada em 19/8/2020 às 17:33:16.

Informe erros ou edite você mesmo!