2010-12-01 10 views
2

Mac OS X 10.6.5では、XCode 3.2.1 64ビットを使用して、ビルド構成が10.6のCコマンドラインツールをビルドしています。デバッグ| x86_64。私は引数として正の偶数の整数を渡したいので、私はintとしてargvのインデックス1をキャストしています。これは、私のプログラムがchar配列全体を読み込んでint値に変換するのではなく、ascii値を取得しているように見えることを除いて、うまくいくようです。 「progname 10」と入力すると、「progname 1」と入力したときに入力した49文字が入力されたことがわかります。どのようにしてCが整数値としてchar配列全体を読み込むようにすることができますか? Googleはme(int)* charPointerしか表示していませんが、明らかにそれは機能しません。プログラム引数* charをintとして正しくキャストするには?

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

int main(int argc, char **argv) { 
    char *programName = getProgramName(argv[0]); // gets the name of itself as the executable 
    if (argc < 2) { 
     showUsage(programName); 
     return 0; 
    } 
    int theNumber = (int)*argv[1]; 
    printf("Entered [%d]", theNumber);   // entering 10 or 1 outputs [49], entering 9 outputs [57] 
    if (theNumber % 2 != 0 || theNumber < 1) { 
     showUsage(programName); 
     return 0; 
    } 

    ... 

} 

答えて

8

argv配列の数値は文字列表現です。整数に変換する必要があります。

sscanf

int num; 
sscanf (argv[1],"%d",&num); 

またはatoi()(利用可能な場合)

0

使用atoi()またはstrol()機能。

9

キャスティングではできません。実際にテキスト表現を解析し、整数に変換する必要があります。

古典的な関数はatoi()ですが、strtol()、さらにはsscanf()もあります。

+3

が今までそれが使用できない場合があり、 ')(' atoi関数を使用しないでくださいなどATOI()、のsscanf()などの一部の機能を使用することができますし、それはありません* no **エラーチェック:http://stackoverflow.com/questions/2729460/usage-of-atoi-in-the-c-language –

+0

ありがとうございました。 –

+1

@Ivo、atoiはC標準によって指定されているため、あらゆる場所に存在する可能性があります。それはエラーチェックを行うだけで、それは役に立たない方法で(ゼロとして)報告します。 strtolは、使いにくいクイックスローアウェイコードを除いて、より優れた機能です。 –

1

は、あなたが引数として9を持っているとしましょう。あなたは57、ascii値を得ていると言いました。

int num = *arg[1] - '0'が必要な番号を返すという事実を利用してください。

それは、より多くのように、572だならば、あなたは

char *p = argv[1]; 
int nr = 0; 
int i; 
for(i =0; i< strlen(p); i++) { 
    nr = 10 * nr + p[i] - '0'; 
} 

が行くためにいくつかのエラーチェックとその良いを追加する必要があります。

それとも、あなたが持っているものに応じて、*あなたは