Как конвертировать string в int64 t?

как преобразовать параметр из программы argv до int64_t? atoi() предназначен только для 32-битных целых чисел.

5 ответов


попытка соответствия C99.

[edit] используется @R. correction

// Note: Typical values of SCNd64 include "lld" and "ld".
#include <inttypes.h>
#include <stdio.h>

int64_t S64(const char *s) {
  int64_t i;
  char c ;
  int scanned = sscanf(s, "%" SCNd64 "%c", &i, &c);
  if (scanned == 1) return i;
  if (scanned > 1) {
    // TBD about extra data found
    return i;
    }
  // TBD failed to scan;  
  return 0;  
}

int main(int argc, char *argv[]) {
  if (argc > 1) {
    int64_t i = S64(argv[1]);
    printf("%" SCNd64 "\n", i);
  }
  return 0;
}

есть несколько способов сделать это:

  strtoll(str, NULL, 10);

это POSIX C99 совместимый.

вы также можете использовать strtoimax; который имеет следующий прототип:

 strtoimax(const char *str, char **endptr, int base);

Это хорошо, потому что он всегда будет работать с местными intmax_t ... Это C99 и нужно включать <inttypes.h>


strtoll преобразует его в long long который обычно является 64-битным int.


делать это 100% портативно немного сложно. long long должен быть не менее 64 бит, но необязательно должен быть дополнением twos, поэтому он не может представлять -0x7fffffffffffffff-1, и таким образом, используя strtoll может быть сломанный угловой корпус. Та же проблема относится к strtoimax. Вместо этого вы можете использовать ведущее пространство (если вы хотите разрешить ведущее пространство) и сначала проверить знак, а затем использовать strtoull или strtoumax, которые необходимы для поддержки значений до полного положительный диапазон int64_t. Затем вы можете применить знак:

unsigned long long x = strtoull(s, 0, 0);
if (x > INT64_MAX || ...) goto error;
int64_t y = negative ? -(x-1)-1 : x;

эта логика написана, чтобы избежать всех случаев переполнения.


это сработало для меня с другим типом int64, и мне нравится чистый стиль C++:

std::istringstream iss(argv[i]);
int64_t i64;
iss >> i64;

вы можете получить ошибку компиляции: operartor

и я не знаю, что произойдет, если argv[i] содержит "Алло".