Преобразовать строку в int (но только если действительно int) - PullRequest
3 голосов
/ 08 января 2010

В колледже меня спросили, определяет ли наша программа, является ли строка, введенная из аргументов командной строки, целым числом, которого она не имела (./Program 3.7). Теперь мне интересно, как я могу это обнаружить. Таким образом, ввод, как, например, a, недопустим, что обнаруживает atoi, но ввод, как, например, 3.6, должен быть недействительным, но atoi преобразует это в целое число

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc > 1) {
        int number = atoi(argv[1]);
        printf("okay\n");
    }
}

Но offcourse okay должен быть напечатан, только если argv [1] действительно целое число. Надеюсь, мой вопрос понятен. Большое спасибо.

Ответы [ 4 ]

10 голосов
/ 08 января 2010

Посмотрите на strtol .

Если endptr не равен NULL, strtol () сохраняет адрес первого недопустимого символа в * endptr. Однако, если цифр не было вообще, strtol () сохраняет исходное значение str в * endptr. (Таким образом, если * str не равен \0' but **endptr is \ 0 'при возврате, вся строка была действительной.)

#include <stdio.h>

int main(int argc, char *argv[]) {
  if (argc > 1) {
    char* end;
    long number = strtol(argv[1], &end, 0);
    if (*end == '\0')
      printf("okay\n");
  }
}
2 голосов
/ 08 января 2010

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

  • необязательный знак, + / -.
  • обязательная цифра.
  • любое количество дополнительных цифр (но следите за переполнением).
  • конец строки.

Из этой спецификации вы можете написать функцию, которая сделает всю работу за вас.

Что-то вроде этого псевдокода было бы хорошим началом:

set sign to +1.
set gotdigit to false.
set accumulator to 0.
set index to 0.
if char[index] is '+':
    set index to index + 1.
else:
    if char[index] is '-':
        set sign to -1.
        set index to index + 1.
while char[index] not end-of-string:
    if char[index] not numeric:
        return error.
    set accumulator to accumulator * 10 + numeric value of char[index].
    catch overflow here and return error.
    set index to index + 1.
    set gotdigit to true.
if not gotdigit:
    return error.
return sign * accumulator.
1 голос
/ 08 января 2010
1 голос
/ 08 января 2010
int okay = argc>1 && *argv[1];
char* p = argv[1];
int sign = 1;
int value = 0;
if( *p=='-' ) p++, sign=-1;
else if( *p=='+' ) p++;
for( ; *p; p++ ) {
    if( *p>='0' && *p<='9' ) {
        value = 10*value + *p-'0';
    } else {
        okay = 0;
        break;
    }
}
if( okay ) {
    value *= sign;
    printf( "okay, value=%d\n", value );
}

РЕДАКТИРОВАТЬ: разрешить - и + символы

Вы можете даже сжать это в плотный одно- или двухслойный слой. Или вы можете найти библиотечную функцию с той же функциональностью;)

EDIT2: просто для удовольствия - теперь нужно разобрать число

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...