Как правильно преобразовать программный аргумент * char в int? - PullRequest
3 голосов
/ 01 декабря 2010

Я нахожусь на Mac OS X 10.6.5, использующей 64-битный XCode 3.2.1 для сборки инструмента командной строки C с конфигурацией сборки 10.6 | Отладка | x86_64. Я хочу передать положительное четное целое число в качестве аргумента, поэтому я приводю индекс 1 аргумента argv в виде целого числа. Кажется, это работает, за исключением того, что моя программа получает значение ascii вместо чтения всего массива char и преобразования его в значение int. Когда я вхожу в «progname 10», он говорит мне, что я ввел 49, что я и получаю при вводе «progname 1». Как я могу получить C для чтения всего массива char как значения int? Google только показал мне (int) * charPointer, но ясно, что это не работает.

#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;
    }

    ...

}

Ответы [ 4 ]

12 голосов
/ 01 декабря 2010

Числовое значение в массиве argv находится в строковом представлении. Вам нужно преобразовать его в целое число.

sscanf

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

или atoi() (если имеется)

9 голосов
/ 01 декабря 2010

Приведение не может этого сделать, вам нужно проанализировать текстовое представление и преобразовать в целое число.

Классическая функция для этого называется <a href="http://linux.die.net/man/3/atoi" rel="noreferrer">atoi()</a>, но есть также <a href="http://linux.die.net/man/3/strtol" rel="noreferrer">strtol()</a> или даже <a href="http://linux.die.net/man/3/sscanf" rel="noreferrer">sscanf()</a>.

1 голос
/ 01 декабря 2010

Допустим, у вас есть 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';
}

Добавьте некоторую проверку ошибок и все готово.

Или, в зависимости от того, что у вас есть, вы можете использовать некоторые функции, такие как atoi (), sscanf () и т. Д.

0 голосов
/ 01 декабря 2010

Используйте функции atoi() или strol().

...