comparação de argumentos

Neojag

Power Member
Viva!
Será que alguém me pode dizer porque raio é que este código não está a retornar nada? Se executar o programa com um argumento, argv[1] fica efectivamente com esse valor, mas nada do que está dentro dos if's aparece. Já se definir dentro do programa argv[1]="whatever" os ifs funcionam.
Danke!

Código:
#include <iostream>
#include <math.h>

using namespace std;

int main (int argc, char *argv[]) {
        
    double x,y;
    cout << "Insira dois numeros separados por espaco:\n";
    cin >> x >> y;
    

                    if (argv[1]=="pow") {
                         cout << x <<"^"<< y << " = " << pow(x,y);
                         }
                    if (argv[1]=="mul") {
                         cout << x <<"*"<< y << " = " << x*y;
                         }
                    if (argv[1]=="div") {
                         cout << x <<"/"<< y << " = " << x/y;
                         }  
                    if (argv[1]=="sum") {
                         cout << x <<"+"<< y << " = " << x+y;
                         }
                    if (argv[1]=="diff") {
                         cout << x <<"-"<< y << " = " << x-y;
                         }
                         
}
 
Boas!

O argv apenas é preenchido com os argumentos de quando executas o programa, por exemplo:

./programa umargumento doisargumentos tresargumentos

É assim que o argv é preenchido, e tenho ideia que o array começa em zero..., experimenta a trocares o 1 por 0.

abraços, HecKel

EDIT: Outro problema, a comparação de strings com o == nem sempre funciona bem, sinceramente não me lembro do porquê mas sei que tem justificação :P

Vê isto: http://www.cppreference.com/cppstring/compare.html
 
Última edição:
Viva!
argv[0] é o nome do ficheiro que está a ser executado. Fazendo o output de argv[1] efectivamente ele tem o valor do argumento com que eu executei o programa, só que a comparação não funciona. Se definir o argv[1] dentro do programa, a comparação funciona perfeitamente. I don't get it O_o

Edit: outra coisa que eu não percebi bem na passagem de argumentos na execução é que o array argv[] é um array de caracteres, mas cada um dos registos pode conter uma string...
 
Última edição:
Claro, comparação directa de strings em C não existe.

Em vez de argv[1]=="pow", faz strcmp(argv[1], "pow") == 0.
 
Sim, ele com o strcomp está a funcionar, obrigado ;) O que é não percebo, é porque raio é que a comparação directa funciona se eu definir o valor do argumento dentro do programa!

A propósito, arrays de caracteres não podem ser comparados directamente, mas variáveis do tipo "string" em c++ podem, correcto?
 
Claro, comparação directa de strings em C não existe.

Em vez de argv[1]=="pow", faz strcmp(argv[1], "pow") == 0.

Exactamente, só podes comparar tipos primitivos de dados, tal como int bool, string é um objecto, em c usas strcmp, tal como em java se usa o equals, em java esta muito bem definido o conceito de objecto pois quando defines uma variável string é com letra grande, tal como todos os objectos.
Se recebesses os valores numéricos por argumento usavas o atoi e ai sim poderias comparar com o operador ==
 
A propósito, arrays de caracteres não podem ser comparados directamente, mas variáveis do tipo "string" em c++ podem, correcto?

correcto, logo, se 'argv[1]' é do tipo 'char*' (array de caracteres) não podes comparar directamente. caso o quisesse fazer era só passar o valor de 'argv[1]' para uma string.
 
Exactamente, só podes comparar tipos primitivos de dados, tal como int bool, string é um objecto, em c usas strcmp, tal como em java se usa o equals, em java esta muito bem definido o conceito de objecto pois quando defines uma variável string é com letra grande, tal como todos os objectos.
Se recebesses os valores numéricos por argumento usavas o atoi e ai sim poderias comparar com o operador ==
Por acaso isso não é correcto.
Se fizeres overload aos operadores podes redefinir os operadores básicos para serem utilizados com tipos "user defined", o que é uma boa prática de programação por vários motivos.
 
Entao estamos todos aqui para nos ajudar :)
E sinceramente gosto do espirito aqui na parte de programação:)
Confesso que tambem me fazia confusao quando comecei a aprender Java o porque de ser String e nao string :-D
O que eu queria dizer era que se recebesse tambem os 2 valores por argumento usava o atoi apenas para converter e poder realizar operações numéricas.
 
Última edição:
Back
Topo