Может ли кто-нибудь объяснить, почему эти вызовы не возвращают тот же ожидаемый результат?Различные результаты с использованием atoi
unsigned int GetDigit(const string& s, unsigned int pos)
{
// Works as intended
char c = s[pos];
return atoi(&c);
// doesn't give expected results
return atoi(&s[pos]);
return atoi(&static_cast<char>(s[pos]));
return atoi(&char(s[pos]));
}
Примечание: Я не ищу лучший способ преобразовать char
к int
.
«Работает по назначению» приводит к UB, поскольку вы переходите к 'atoi' одному символу' char' вместо строки с нулевым завершением, которую она ожидает. –
@littleadv: Конечно, я имел в виду * указатель * на один символ; и передача указателя на один символ - это, конечно, UB, потому что у вас нет гарантий того, что следует за ним в стеке (на самом деле это UB, без всяких сомнений, потому что вы делаете память «atoi» за последним элементом «массива» «). –
@Matteo: без всяких сомнений, если 's [pos]' не является 0 байтом или иначе символом, который заставляет 'atoi' прекращать чтение ;-) –