0

C で数学演算を実行するには、数字の配列を整数値に変換する必要があります。atoi(argv[2][count]) を使用すると、最初の桁のみが整数に変換されます。したがって、argv[2]=123 の場合、「1」は整数 1 に変換されるだけです。「123」を 1 つの整数値 123 にするにはどうすればよいですか? ありがとう!

4

2 に答える 2

3

atoi は使用するのに適した関数ですが、C で独自の atoi 関数を作成することもできます。

int xatoi(char *s)
{
   int result=0;       

   while(*s)
   {

     result=result*10+(*s-48);
     s++; 
    }

  return result;

} この背後にあるロジックは、すべての文字 '1'、'2'、...... の ascii 値が格納されていることです。たとえば、'1' には ASCII 値 '49' があります。上記のプログラムをコンパイルしてエラーをチェックしてください。まだテストしていませんが、動作することは間違いありません。

参照用に以下のリンクを参照してください http://www.newebgroup.com/rod/newillusions/ascii.htm

于 2012-10-07T05:55:25.067 に答える
0

argvは文字列配列の配列であるためargv[N]、配列が得られます。しかし、に格納されている配列のargv[N][J]位置に要素を与えます。ただし、関数は実際には文字値ではなく (ヌルで終わる文字列への) ポインターを想定しているため、コンパイラーがコードについて文句を言わなかったのは奇妙です。コンパイラは次のように言うべきでした。警告を無視しないことをお勧めします。個人的には、最高の警告レベルでコードをコンパイルする傾向があり、警告は 1 つもありませんが、作業中のコードベースは数百万行のコードです。Jargv[N]atoi()warning: passing argument 1 of ‘atoi’ makes pointer from integer without a cast

また、よりも使用することをお勧めしstrtolますatoi。の問題atoiは、無効な入力を無視することです (つまり、問題がなければ、 に影響を与えずに 0 を返すだけですerrno)。

とにかく、コマンドラインから基数 10 の整数の配列を取得する方法の例を次に示します。

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

int main(int argc, char *argv[])
{
    int  i;
    int  n;
    char    *e;
    int     *v;

    if (argc < 2) {
        fprintf(stderr, "Please specify some numbers\n");
        return EXIT_FAILURE;
    }

    n = argc - 1;
    v = alloca(sizeof(int) * n);

    for (i = 1; i < argc; ++i) {
        v[i-1] = strtol(argv[i][i], &e, 10);
        if (!v && errno) {
            fprintf(stderr, "Cannot convert '%s' into number: %s\n",
                argv[i], strerror(errno));
            return EXIT_FAILURE;
        } else if (*e != '\0') {
            fprintf(stderr, "%s is not a number\n", argv[i]);
            return EXIT_FAILURE;
        }
    }

    printf("You have entered the following numbers: %d", v[0]);

    for (i = 1; i < n; ++i)
        printf(", %d", v[i]);
    printf("\n");

    return EXIT_SUCCESS;
}

それが役に立つことを願っています。

于 2012-10-07T03:15:14.097 に答える