Если кто-то должен использовать sscanf()
для обнаружения переполнения int
, а не надежного strtol()
, существует громоздкий способ.
Используйте более широкий тип и ограничение ширины, чтобы предотвратить переполнение при сканировании.
bool isint_via_sscanf(const char *s) {
long long y;
int n = 0;
if (sscanf(s, "18%lld %n", &y, &n) != 1) { // Overflow not possible
return false; // Conversion failed
}
if (y < INT_MIN || y > INT_MAX) {
return false; // Outside int range
}
if (s[n]) {
return false; // Trailing junk
}
return true;
}
Недостаточно на редких платформах, где INT_MAX > 1e18
.
Также неверно возвращает ввод, такой как "lots of leading space and/or lot of leading zeros 000123"
, как недействительный.
Более сложный код, использующий sscanf()
, может устранить эти недостатки, но лучший подход - strto*()
.
Можно попробовать codeplex проект SVN к Инструменту Миграции TFS .
Поскольку проект codeplex, который был принят в качестве первоначального ответа, сейчас закрыт, я подумал, что было бы полезно отметить, что Microsoft имеет ряд перечисленных здесь инструментов преобразования: Инструменты миграции управления исходным кодом .
Можно хотеть взглянуть на это обсуждение: это обсуждение . Два инструмента называют в нем. Мой опыт с миграцией другого пути был очень неудачным, между прочим. Вытаскивание Вашей истории из TFS является очень трудным и требует пользовательского кодирования. Именно так Вы знаете.