Publicidade

Argumentos de Linha de Comando (argc/argv)

Aprenda como passar parâmetros para o seu programa em tempo de execução.

O que são argc e argv?

Até agora, você estava escrevendo int main(void). Mas main também pode ser escrita para aceitar argumentos da linha de comando.
int main(int argc, char *argv[]) {
    // argc: number of arguments (Argument Count)
    // argv: array of argument strings (Argument Vector)
}
argc
O número de argumentos (incluindo o nome do próprio programa).
argv[]
Cada argumento como string — um array de char*.
Por exemplo, se você roda ./myprogram hello world:
VariávelValorSignificado
argc33 argumentos no total
argv[0]"./myprogram"o nome do programa
argv[1]"hello"primeiro argumento
argv[2]"world"segundo argumento
Importante: argv[0] guarda o próprio nome do programa. Os argumentos fornecidos pelo usuário começam em argv[1].

Uso básico

Aqui está um programa que imprime cada argumento recebido:
#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("Number of arguments: %d\n", argc);
    for (int i = 0; i < argc; i++) {
        printf("argv[%d] = %s\n", i, argv[i]);
    }
    return 0;
}
$ gcc args.c -o args $ ./args hello world 123 Number of arguments: 4 argv[0] = ./args argv[1] = hello argv[2] = world argv[3] = 123

Usando argumentos como números

Todo elemento de argv é uma string (um char*). Para usar um como número, você tem que converter primeiro.
FunçãoTipo de destinoHeaderExemplo
atoi(s)intstdlib.hint n = atoi(argv[1]);
atof(s)doublestdlib.hdouble d = atof(argv[1]);
atol(s)longstdlib.hlong l = atol(argv[1]);

Exemplo: calculadora na linha de comando

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

int main(int argc, char *argv[]) {
    if (argc != 3) {
        printf("Usage: %s num1 num2\n", argv[0]);
        return 1;
    }
    int a = atoi(argv[1]);
    int b = atoi(argv[2]);
    printf("%d + %d = %d\n", a, b, a + b);
    return 0;
}
$ ./calc 15 27 15 + 27 = 42
Sempre valide seus argumentos. Cheque argc primeiro e, se a contagem estiver errada, imprima uma mensagem de uso e saia.

Exemplo prático: passando um nome de arquivo

Programas do mundo real frequentemente recebem o nome de um arquivo para processar como argumento da linha de comando.
#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc != 2) {
        printf("Usage: %s filename\n", argv[0]);
        return 1;
    }
    FILE *fp = fopen(argv[1], "r");
    if (fp == NULL) {
        printf("Cannot open file '%s'\n", argv[1]);
        return 1;
    }
    char line[256];
    while (fgets(line, 256, fp) != NULL) {
        printf("%s", line);
    }
    fclose(fp);
    return 0;
}
$ ./cat scores.txt Taro 80 Hanako 95 Jiro 70
Esta é uma versão simplificada do clássico comando cat do UNIX.

Quiz

// When you run the following command
// $ ./prog hello world

Qual é o valor de argc?

2
3
1
0
Explicação: argc conta os argumentos incluindo o nome do programa: ./prog, hello, world — isso dá 3.
Então argv[0]="./prog", argv[1]="hello", argv[2]="world".
// Running $ ./calc 10 20
int a = atoi(argv[1]);
int b = atoi(argv[2]);
printf("%d\n", a + b);

O que ele imprime?

30
1020
erro
0
Explicação: atoi("10") → 10 e atoi("20") → 20, então 10 + 20 = 30.
Sem atoi, você pode acabar com concatenação de strings ("1020") — cuidado com isso.
Compartilhe este artigo
Compartilhar no X Compartilhar no Facebook