Преобразовать строку в int (но только если это действительно int)

StackOverflow https://stackoverflow.com/questions/2024648

  •  19-09-2019
  •  | 
  •  

Вопрос

В колледже меня спросили, определяет ли наша программа, является ли строка, введенная из аргументов командной строки, целым числом, чего она не сделала(./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");
    }
}

Но, конечно, «ОК» следует печатать только в том случае, если argv[1] действительно является целым числом.Надеюсь, мой вопрос ясен.Большое спасибо.

Это было полезно?

Решение

Посмотри на стртол.

Если значение 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");
  }
}

Другие советы

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

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

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

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

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.
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 );
}

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

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

РЕДАКТИРОВАТЬ2:просто ради интереса — теперь он должен проанализировать число

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top