Подтвердить что ты не робот

Как я могу получить argv [] как int?

У меня есть такой код:

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

и в оболочке я делаю это:

./test 7

но первый результат printf не равен 7, как я могу получить argv [] как int? большое спасибо

4b9b3361

Ответ 1

argv[1] является указателем на строку.

Вы можете распечатать его, используя: printf("%s\n", argv[1]);

Чтобы получить целое число из строки, вы должны сначала его преобразовать. Используйте strtol для преобразования строки в int.

#include <errno.h>   // for errno
#include <limits.h>  // for INT_MAX
#include <stdlib.h>  // for strtol

char *p;
int num;

errno = 0;
long conv = strtol(argv[1], &p, 10);

// Check for errors: e.g., the string does not represent an integer
// or the integer is larger than int
if (errno != 0 || *p != '\0' || conv > INT_MAX) {
    // Put here the handling of the error, like exiting the program with
    // an error message
} else {
    // No error
    num = conv;    
    printf("%d\n", num);
}

Ответ 2

Вы можете использовать strtol для этого:

long x;
if (argc < 2)
    /* handle error */

x = strtol(argv[1], NULL, 10);

В качестве альтернативы, если вы используете C99 или лучше, вы можете исследовать strtoimax.

Ответ 3

Основное использование

Для этого стандартна функция "string to long" (strtol) ("long" может содержать числа намного больше, чем "int"). Вот как это использовать:

#include <stdlib.h>

long arg = strtol(argv[1], NULL, 10);
// string to long(string, endpointer, base)

Поскольку мы используем десятичную систему, base равен 10. Аргумент endpointer будет установлен на "первый недопустимый символ", то есть на первый нецифровый символ. Если вам все равно, установите аргумент в NULL вместо передачи указателя, как показано.

Проверка ошибок (1)

Если вы не хотите, чтобы встречались нецифровые символы, вы должны убедиться, что он установлен в "нулевой терминатор", так как \0 всегда является последним символом строки в C:

#include <stdlib.h>

char* p;
long arg = strtol(argv[1], &p, 10);
if (*p != '\0') // an invalid character was found before the end of the string

Проверка ошибок (2)

Как упоминается на справочной странице, вы можете использовать errno чтобы проверить, не возникло ли ошибок (в этом случае переполнения или переполнения).

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

char* p;
errno = 0; // not 'int errno', because the '#include' already defined it
long arg = strtol(argv[1], &p, 10);
if (*p != '\0' || errno != 0) {
    return 1; // In main(), returning non-zero means failure
}

// Everything went well, print it as 'long decimal'
printf("%ld", arg);

Преобразовать в целое число

Так что теперь мы застряли с этим long, но мы часто хотим работать с целыми числами. Чтобы преобразовать long в int, мы должны сначала проверить, что число находится в пределах ограниченного объема int. Для этого мы добавляем второе выражение if, и, если оно совпадает, мы можем просто привести его.

#include <stdlib.h>
#include <errno.h>
#include <limits.h>

char* p;
errno = 0; // not 'int errno', because the '#include' already defined it
long arg = strtol(argv[1], &p, 10);
if (*p != '\0' || errno != 0) {
    return 1; // In main(), returning non-zero means failure
}

if (arg < INT_MIN || arg > INT_MAX) {
    return 1;
}
int arg_int = arg;

// Everything went well, print it as a regular number
printf("%d", arg_int);

Чтобы увидеть, что произойдет, если вы не выполните эту проверку, протестируйте код без INT_MIN if INT_MIN/MAX. Вы увидите, что если вы передадите число, большее 2147483647 (2 31), оно будет переполнено и станет отрицательным. Или, если вы передадите число, меньшее -2147483648 (-2 31 -1), оно опустится и станет положительным. Значения за этими пределами слишком велики, чтобы вписать их в целое число.

Полный пример

#include <stdio.h>  // for printf()
#include <stdlib.h> // for strtol()
#include <errno.h>  // for errno
#include <limits.h> // for INT_MIN and INT_MAX

int main(int argc, char** argv) {
    char* p;
    errno = 0; // not 'int errno', because the '#include' already defined it
    long arg = strtol(argv[1], &p, 10);
    if (*p != '\0' || errno != 0) {
        return 1; // In main(), returning non-zero means failure
    }

    if (arg < INT_MIN || arg > INT_MAX) {
        return 1;
    }
    int arg_int = arg;

    // Everything went well, print it as a regular number plus a newline
    printf("Your value was: %d\n", arg_int);
    return 0;
}

В Bash вы можете проверить это с помощью:

cc code.c -o example  # Compile, output to 'example'
./example $((2**31-1))  # Run it
echo "exit status: $?"  # Show the return value, also called 'exit status'

Используя 2**31-1, он должен напечатать число и 0, потому что 2 31 -1 находится в пределах диапазона. Если вместо этого вы передадите 2**31 (без -1), номер не будет напечатан, и статус выхода будет 1.

Помимо этого, вы можете реализовать пользовательские проверки: проверить, передал ли пользователь аргумент вообще (проверьте argc), проверить, находится ли число в нужном диапазоне, и т.д.

Ответ 4

Вы можете использовать функцию int atoi (const char * str);.
Вам нужно включить #include <stdlib.h> и использовать функцию следующим образом:
int x = atoi(argv[1]);
Здесь при необходимости дополнительная информация: atoi - Ссылка на С++

Ответ 5

/*

    Input from command line using atoi, and strtol 
*/

#include <stdio.h>//printf, scanf
#include <stdlib.h>//atoi, strtol 

//strtol - converts a string to a long int 
//atoi - converts string to an int 

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

    char *p;//used in strtol 
    int i;//used in for loop

    long int longN = strtol( argv[1],&p, 10);
    printf("longN = %ld\n",longN);

    //cast (int) to strtol
    int N = (int) strtol( argv[1],&p, 10);
    printf("N = %d\n",N);

    int atoiN;
    for(i = 0; i < argc; i++)
    {
        //set atoiN equal to the users number in the command line 
        //The C library function int atoi(const char *str) converts the string argument str to an integer (type int).
        atoiN = atoi(argv[i]);
    }

    printf("atoiN = %d\n",atoiN);
    //-----------------------------------------------------//
    //Get string input from command line 
    char * charN;

    for(i = 0; i < argc; i++)
    {
        charN = argv[i];
    }

    printf("charN = %s\n", charN); 

}

Надеюсь, это поможет. Удачи!