2017-02-09 5 views
1

Поскольку я совершенно новичок в C, есть кое-что, что я пока не вижу в указателях. Я бы хотел проверить, имеет ли аргумент командной строки целое число или нет, но в отдельной функции, поэтому я передаю указатель массива argv.C: Доступ ко второму argv с помощью указателя

int main(int argc, char* argv[]){ 
    if(check(argv)){ 
     // Do stuff to argv[1] 
    } 
} 

int check(char* p){ 
    // Test wether p+1 is int 
    return 1; 
} 

Я попробовал несколько вещей, в основном, в результате чего странно Printf-х (при печати разыменованный указатель для проверки значения).

int i = atoi(argv[1]); 

Работы просто отлично, конечно. Но поскольку указатель - это единственное, что передается функции, я парализован.

+1

ARGC следует использовать, прежде чем индексация ARGV – Aubin

+0

изменения «Int проверки (символ * р)» к «Int проверки (символ * p []) 'или' int check (char ** p) ' –

+0

Текущий код недействителен. И компилятор рассказал вам об этом. Нет смысла пытаться экспериментировать с ним, используя текущую версию в качестве отправной точки. – AnT

ответ

0

ARGV является двумерный массив, который должен сказать, что ARGV массив массивов. В частности, argv представляет собой массив массивов char. Теперь данные, которые хранит argv, это аргументы, переданные из командной строки в программу, причем argv [0] является фактическим именем программы, а остальные являются аргументами.

Теперь, чтобы ответить на ваш вопрос, вам не нужно полностью передавать argv функции «проверка». Что вам нужно сделать, это передать один из элементов argvs. Это связано с тем, что параметр «проверка» - это массив символов, а argv - массив массивов символов. Поэтому попробуйте передать argv [1], чтобы проверить первый аргумент.

Edit: Попробуйте проверить все аргументы, кроме названия программы

#include <stdio.h> 
#include <ctype.h> 

int main(int argc, char* argv[]) { 
    for (int i = 1; i < argc; ++i) { 
     if(check(argv[i])){ 
      // Do stuff to argv[i] 
     } 
} 

int check(char* p){ 
    int i = 0; 
    char c = p[i]; 
    while (c != '\0') { 
     if (!isdigit(c)) 
      return 0; 
     c = p[++i]; 
    } 
    return 1; 
} 
+0

Чтобы убедиться: для проверки int (char ** p), p [1] будет указателем на второй argv? – Felix

+0

@Felix да, но только если достаточные аргументы фактически пройдены – Alnitak

+0

@Alnitak Да, это не проблема. Большое спасибо! – Felix

0
int check(char* p){ 

выше функция ожидает указатель на char в то время как вы передаете argv который является массивом char * Попробуйте

int check(char* p[]){ 

Также перед использованием argv[1] проверки, если argv[1] существует т.е. проверить argc

int main(int argc, char* argv[]){ 
if(argc>1 && check(argv)){ 
    // Do stuff to argv[1] 
}} 
0

Перед индексированием массива poi Мы должны быть уверены, что это действительно так. Для этой цели мы должны использовать argc.

strtol - это функция, которая анализирует строку и обнаруживает ошибку, если это не база.

Ty это:

int main(int argc, char* argv[]){ 
    if(check(argc, argv)){ 
     // Do stuff to argv[1] 
    } 
} 

int check(int argc, char * argv[]){ 
    if(argc > 1) { 
     char * err = NULL; 
     strtol(argv[1], &err, 10); 
     return argv[1][0] != '\0' && *err != '\0'; 
    } 
    return 0; 
} 
+0

Пояснение, данное ... – Aubin

+0

NB: конечный указатель в массиве 'argv []' гарантированно будет 'NULL', поэтому вы не должны _strictly_ сначала проверять' argc'. – Alnitak

+0

У вас есть хороший нормативный источник для этого или это использование, конвенция? – Aubin

Смежные вопросы