2011-02-09 32 views
5

ben çalıştırıldığında argümanları kabul etmelidir C hesap ++ bir tür var. Ancak, 7 argüman olarak girdiğimde, bir değişkene konduğunda 10354 olduğu ortaya çıkabilir. İşte benim kodudur:tamsayı argümanlar ++

#include "stdafx.h" 
#include <iostream> 

int main(int argc, int argv[]) 
{ 
    using namespace std; 
    int a; 
    int b; 
    if(argc==3){ 
     a=argv[1]; 
     b=argv[2]; 
    } 
    else{ 
     cout << "Please enter a number:"; 
     cin >> a; 
     cout << "Please enter another number:"; 
     cin >> b; 
    } 
    cout << "Addition:" << a+b << endl; 
    cout << "Subtaction:" << a-b << endl; 
    cout << "Multiplycation:" << a*b << endl; 
    cout << "Division:" << static_cast<long double>(a)/b << endl; 
    system("pause"); 
    return 0; 
} 
+0

dönüştürmek atoi() kullanın. -Gcc kullanırken. Derleyicinin, bir hatasi tamsayıya çevirmekle ilgili bir uyariyle bu hatayı yapmanizi engellediginden şüpheleniyorum. –

+0

@deft_code? İşaretçiden dönüşüme tam sayı nerede? 'main' sadece yanlış tip imzası vardır. –

+0

FYI, çoğu matematikçi bölüşmeden önce paydayı sıfıra göre kontrol etmeyi gerektirir. Yasak olduğunu duydum. Programlama teriminin "Tanımsız davranış" olduğuna inanıyorum. Program bir sinyal veya istisna oluşturacaktır. Dünyalar parçalanabilir. Kim bilir? –

cevap

19

sen int argv[] aldın Nerede? main numaralı ikinci argüman char* argv[]'dur.

Sen atoi veya strtod kullanarak tamsayı dize bu komut satırı argümanları dönüştürebilirsiniz. Örneğin

:

a=atoi(argv[1]); 
    b=atoi(argv[2]); 

Ama işletim sistemi Hoşuna olsun veya olmasın formu dizede size komut satırı argümanları verecek çünkü sadece, parametre türünü değiştiremezsiniz.

NOT: atoi işlevini kullanmak için #include <stdlib.h> (veya #include <cstdlib> ve using std::atoi;) işlevlerini kullanmalısınız. Eğer hata denetimi istiyorsanız


, strtol yerine atoi kullanın. Bunu kullanmak neredeyse kolay, ve aynı zamanda ayrıştırma sona erdi dizede konum için bir işaretçi verir. Bu sonlandırıcı NUL işaret ediyorsa, ayrıştırma başarılı oldu. Ve tabii ki, kullanıcının yeterli parametre sağladığından emin olmak ve argv'dan eksik parametreleri okumaya çalışmaktan kaçınmak için argc numaralı telefonu doğrulamanız iyi olacaktır. main

+0

Dizeden tamsayıya dönüştürmek için başka bir yöntem de std :: istringstream' kullanmaktır. –

+1

@Thomas: Binlerce ayırıcı ve para birimi simgelerini ve malzemelerini kullanmanız gerekiyorsa, evet. Aksi takdirde sadece 5 kat fazla kod ve 20 kat daha yavaş. –

+0

Reddetme nedeni? –

2

İkinci parametre char* argv[] veya char** argv ya da olmalıdır, ya. Daha sonra bunları int'a dönüştürmelisiniz.

4

işlev imzası int main(int argc, char *argv[]) olduğunu. argv bir dizi dize işaretçisi.

argüman 7 ise, bir dize biçiminde olacaktır ("7"). Maksimum uyarılar etkin halde daima kodunuzu derlemek sayısı 7'de

+0

Teşekkürler. Bu işlevi bilmiyordum. Static_cast ve int argc ve char * argv [] argümanlarını kullandığımda, bir hatayla sonuçlanır. – Rob

+0

@Rob: int * 'yi int'ye çeviriyor olsaydınız, derleyicinizin buna izin vermemesine sevin. Derlerseniz, ciddi bir hatayı içeren bir programınız olur. Dize, bir dizi karakterdir. '7' karakterinin değeri 7 değildir. 7 ile matematik yapmak istiyorsanız, dizeyi dönüştürmeniz gerekir. –