2012-03-19 12 views
10

何らかの理由で、私のCプログラムがargvの要素をintに変換することを拒否しています。理由を理解できません。charがintに変換されていません

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

    fprintf(stdout, "%s\n", argv[1]); 

    //Make conversions to int 
    int bufferquesize = (int)argv[1] - '0'; 

    fprintf(stdout, "%d\n", bufferquesize); 
} 

そして./test 50を実行している場合、これが出力されます。

-1076276207

私は*と&の両方を投げて、(int)を削除しようとしています(int)とargv [1]の間で、前者は5を返しますが50は返しませんでしたが、後者は上記のような出力を与えました。 - '0'操作を削除してもあまり役に立ちません。私はまた、char = firstをargv [1]に変換しようとしました。代わりに最初に変換を使用しました。この奇妙なことに、入力に関係なく17を与えました。

私は非常に混乱しています。何が起こっている?

+0

'argv [1] [0]'(型は 'char')<最初の引数の最初の文字(exec名の後ろ)を意味すると思います。もちろん、まだチェックはありませんし、より良い方法があります。'' argv [1] 'が' 'char * ''とタイプされているので)、エラーをキャストしようとしないでください:-) –

答えて

12

argv[1]あなたはchar *intに変換することはできませんchar *ないcharです。 argv [1]の最初の文字をintに変更したい場合はできます。

int i = (int)(argv[1][0] - '0'); 

は、私は、この

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

int main(int argc, char **argv) { 
    printf("%s\n", argv[1]); 

    int i = (int)(argv[1][0] - '0'); 

    printf("%d\n", i); 
    return 0; 
} 

を書き、この

./testargv 1243 

のようにそれを実行し、

1243 
1 
+0

atoiへの参照を削除しました...なぜですか? – FrankieTheKneeMan

+0

@FrankieTheKneeMan私はatoiを使ったことはなかった。あなたが望むならそれを使うことができますが、私の答えは決してそれを持っていませんでした。 Scott Hunterの答えはそれを使っています。 – twain249

+0

hh。私は間違っていると思う。 – FrankieTheKneeMan

52

atoi(argv[1])( "ascii to int")を試してみてください。

+10

これは選択された答えです。 – RyanB

+1

これはここにあります。これに対してatoi()関数が作成されました。 –

3

あなただけchar* int型に変換しようとしているのですもちろんそれはあまり意味がありません。おそらく、好きなことを実行する必要があります。

int bufferquesize = 0; 
for (int i = 0; argv[1][i] != '\0'; ++i) { 
    bufferquesize *= 10; bufferquesize += argv[1][i] - '0'; 
} 

これはあなたのchar*がしなければならないない、それは必要がありますが、おそらく、「\ 0」で終了していること、しかし、想定しています。

+1

実際には、 'char's *の配列は、あなたの' char * 'が*を指す*が' '\ 0'''で終わるものとみなされます。ポインタが "0"で終わるかどうか(その意味はとにかく、その表現が0バイトで終わるかどうかは問題ではない) –

+0

もちろん、文章 "charへのポインタ"は特定のシンボル "は意味をなさない。訂正していただきありがとうございます。 –

2

(型)は、型をキャストするために存在します - プログラムがメモリのように見える方法を変更します。具体的には、文字「5」のバイトコードを読み取り、それをメモリに転送する。 char *はcharの配列で、charは1バイトの符号なし整数です。 argv[1]は最初の文字を指します。あなたは

int i = (int) *argv[1] 

をキャストしたときにのみ、intに最初の要素をキャストしている

['5']['0'] 

:あなたの「文字列が」としてメモリに代表されるように、Cのポインタの迅速な説明についてはhereをチェックしたがって、あなたはなぜ

スコットハンター、またはstrtol()で述べたようなatoi()のいずれかのエラー検出動作のために私が好む機能です。

関連する問題