Книга: Язык Си - руководство для начинающих
Преобразование строки в целое: stoi( )
Преобразование строки в целое: stoi( )
Сначала опишем, каким должен быть вход и выход у этой функции. Вход будет символьной строкой, поэтому stoi( ) будет иметь символьную строку в качестве аргумента. На выходе должно быть получено два значения: состояние и преобразованное целое число. Мы применяем return для состояния и поэтому должны использовать указатель для возврата другого значения. Таким образом, появится второй аргумент - указатель на целое число. Скелет нашей функции будет выглядеть примерно так:
stoi(string, intptr)
char string[ ]; /* вводимая строка * /
int *intptr; /* указатель на переменную, получающую целое значение*/
{
int status;
...
return(status);
}
Прекрасно, а что можно сказать об алгоритме выполнения преобразования? На некоторое время проигнорируем знак и предположим, что строка содержит только цифры. Возьмем первый символ и преобразуем его в числовой эквивалент. Предположим, это символ '4'. Он имеет в коде ASCII числовое значение 52 и в таком виде запоминается. Если мы из него вычтем 48, то получим 4, т. е.
'4' - 48 = 4
Но 48 - это ASCII-код символа '0', поэтому
'4' - '0' =4
Действительно, этот последний оператор был бы справедлив в любом коде, в котором используются последовательные числа для представления последовательных цифр. Поэтому если num- числовое значение, a chn- символ цифры, то
num = chn - '0';
Итак, мы используем этот метод для преобразования первой цифры в число. Теперь возьмем следующий элемент массива. Если он '', то у нас была только одна цифра, и мы закончили работу. Предположим, однако, что этот элемент '3'. Превратим его в числовое значение 3. Но если оно равно 3, то 4 должно было быть числом 40, а оба числа вместе 43:
num = 10 * num + chn - '0';
Теперь просто продолжим этот процесс, умножая старое значение num на 10 каждый раз, когда мы находим следующую цифру. Наша функция будет использовать этот метод.
Вот определение функции stoi( ). Мы храним ее в том же файле, что и getint( ), так что она может использовать те же самые директивы #define.
/* превращает строку в целое число и сообщает о состоянии */
stoi(string, intptr)
char string[ ]; /* строка, подлежащая преобразованию в целое*/
int *intptr; /* значение целого */
{
int sign = 1; /* проверяет наличие знака + или - */
int index = 0;
if(string[index] == '-' || string[index] == '+')
sign = (string[index ++] == '-') ? -1 : 1; /* установить знак */
*intptr = 0; /* начальное значение */
while(string[index] >= '0' && string[index] <= '9')
*intptr = 10 * (*intptr) + strmg[index++] - '0';
if(string[index] == '')
{
*intptr = sign * (*intptr);
return(YESNUM); }
else /* найден символ, отличный от цифры, знака или ' ' */
return(NONUM);
}
Оператор while продолжает работу, преобразуя цифры в числа, пока не достигнет нецифрового символа. Если это символ'', все прекрасно, потому что он означает конец строки. Любой другой нецифровой символ отсылает программу кelse для сообщения об ошибке.
Стандартная библиотека языка Си содержит функцию atoi( ) (перевод кода ASCII в целое число), очень похожую на stoi( ). Основная разница заключается в том, что stoi( ) проверяет на нецифровые строки, a atoi( ) использует return вместо указателя, для возврата числа, и пропускает пробел, как мы это делали в getint(). Можно было бы осуществить все проверки состояния в getint( ) и использовать atoi( ) вместо stoi( ), но мы полагаем, что было бы интереснее разрабoтать нашу собственную версию.
- 2.2. Базовая обработка командной строки
- 4. Символьные строки директива #define, функции printf( ) и scanf( )
- 28.1. Преобразование идентификатора в имя
- Пример 12-44. Преобразование метров в мили
- Компилятор командной строки для C# (csc.exe)
- 13. Символьные строки и функции над строками
- Инструмент командной строки gbak
- Инструмент командной строки gfix
- Преобразование XML в реляционную базу данных
- Запросы, подсчитывающие строки
- Как открыть каталог с помощью командной строки?
- Как заблокировать компьютер с помощью командной строки?