2013-10-06 3 views
1

Я новичок в C, и я думаю, как написать эту функцию самостоятельно. Я беру параметр из командной строки, поэтому он хранится в массиве argv, и я хочу решить, является ли оно числом или нет. Каков самый простой способ сделать это?Как написать собственную функцию isnumber()?

Спасибо

#include <stdio.h> 

int isNumber(int *param) 
{ 
    if (*param > 0 && *param < 128) 
     return 1; 
    return 0; 
} 

int main(int argc, char *argv[]) 
{ 
    if (argc == 2) 
     isNumber(argv[1]); 
    else printf("Not enought parameters."); 

    return 0; 
} 
+0

Я редактировал сообщение. –

+1

Что заставляет вас думать 'argv [1]' преобразуется в 'int'? – P0W

+0

Ваш код не будет компилироваться без ошибок. Поскольку 'argv [1]' является 'char *', но 'isNumber' хочет' int' (и очень плохо назван: каждый 'int param' * является * числом!) –

ответ

3

Читайте о strtol(3). Вы можете использовать его в качестве

bool isnumber(const char*s) { 
    char* e = NULL; 
    (void) strtol(s, &e, 0); 
    return e != NULL && *e == (char)0; 
} 

, но это не очень эффективно (например, для строки с миллионом цифр), так как бесполезно преобразование будет сделано.

Но на самом деле, вы часто заботитесь о значении этого числа, так что вы могли бы назвать strtol в вашей обработке аргументов программы (из argv аргумента main) и заботиться о результате strtol, что является фактическим значением числа ,

Вы используете тот факт, что strtol может обновить (через свой третий аргумент) указатель на конец номера в разобранной строке. Если этот конечный указатель не станет концом строки, преобразование каким-то образом не удалось.

Э.Г.

int main (int argc, char**argv) { 
    long num = 0; 
    char* endp = NULL; 
    if (argc < 2) 
    { fprintf(stderr, "missing program argument\n"); 
     exit (EXIT_FAILURE); }; 
    num = strtol (argv[1], endp); 
    if (endp == NULL || *endp != (char)0) 
    { fprintf(stderr, "program argument %s is bad number\n", argv[1]); 
     exit (EXIT_FAILURE); }; 
    if (num<0 || num>=128) 
    { fprintf(stderr, "number %ld is out of bounds.\n", num); 
     exit(EXIT_FAILURE); }; 
    do_something_with_number (num); 
    exit (EXIT_SUCCESS); 
} 
+0

+1 Это только проверка на весь _ "number" _ – P0W

+0

Я знаю функцию strtol. Я действительно хотел сделать это без него. И максимальное число будет 127. –

+0

Затем используйте 'strtol' и проверьте также, что это результат' <128' (и, возможно, '> = 0') и проверьте конечный указатель. BTW, 127 может быть записан как «00000177» (восьмеричный) или «0x0000000000000000000000000000000000000000000000000000000000000000000FF (hex) каким-то странным пользователем. –

0

Как о попытке так:

#include <ctype.h> 

if(isdigit(input)) 
{ 
    return true; 
} 
else 
{ 
    return false; 
} 

ИЛИ более просто, как Н2СО3 прокомментировал:

#define isnumber isdigit 

ИЛИ

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
int main() { 

    //some code 
    theChar = atoi(string[i]); 
    if (isdigit(theChar)) { 
    return true; 
    } 
    return 0; 
} 
+2

Это написано просто как '#define isnumber isdigit' –

+0

@ H2CO3: - Да, это правда. Я просто подумал написать так. Это неправильно? :( –

+0

Это не так, просто лишний, и имхо это не очень помогает, поскольку у ОР есть строка, а не один символ (не так, как он не должен был это понять сам, но в любом случае.) –

0

Как насчет

#define MYISNUM(x) ((x) >= '0' && (x) <= '9') 
+3

Лучше использовать 'isdigit' от' ' –

0

Я не уверен, если вы хотите проверить, если это число или цифра и argv[1] имеет тип char * не Int, так что вы должны сделать что-то вроде этого:

bool isDigit(char *param) 
{ 
    return (*param >= `0` && *param <= `9`) 
} 

bool isNumber(char *param) 
{ 
    while (param) 
    { 
     if (!isDigit(param)) 
      return false; 
     param++; 
    } 
    return true; 
} 
Смежные вопросы