Перевод строки из цифр и знаков перед ней в целое число - C (СИ)
Формулировка задачи:
Составить программу, которая переводит строку, состоящую из цифр и возможно из
знаков + или - (в начале строки) в целое число
Решение задачи: «Перевод строки из цифр и знаков перед ней в целое число»
textual
Листинг программы
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_INPUT_LENGTH 100
#pragma pack(1, push)
inline char in_array(const char*, char);
ptrdiff_t toDec(char*, int&);
void controlInput(char*, int&);
int input(char*);
int main(){
char str[MAX_INPUT_LENGTH]={'\0'};
int start=input(str);
controlInput(str, start);
system("PAUSE");
}
int input(char* str)
{
fgets(str, MAX_INPUT_LENGTH, stdin);
str[strlen(str)-1]='\0';
int start=0;
if(str[0]=='-' || str[0]=='+')
start=1;
return start;
}
inline char in_array(const char* arr, char key){
for(size_t i = 0; i < strlen(arr); ++i)
if(arr[i]==key)
return 1;
return 0;
}
void controlInput(char* str, int &start){
while(strlen(str)==1 && start==1)
{
printf("\nNekorrectno vvedeni dannie!\nVvedite ih echo raz: \n");
start=input(str);
}
char nums[]="0123456789";
for(size_t i = start; i < strlen(str); ++i){
if(!in_array(nums, str[i])){
printf("\nNekorrectno vvedeni dannie!\nVvedite ih echo raz: \n");
start=input(str);
i=start;
}
}
#ifndef _WIN64
printf("\n--------\n%I32d\n", toDec(str, start));
#else
printf("\n--------\n%I64d\n", toDec(str, start));
#endif
}
ptrdiff_t toDec(char* str, int &start){
size_t mnoj=1;
ptrdiff_t out=0;
for(ptrdiff_t i=strlen(str)-1; i>=start; --i)
{
out+=(str[i]-48)*mnoj;
mnoj*=10;
}
if( str[0]=='-' )
out*=-1;
return out;
}
#pragma pack(pop)
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы: stdlib.h, printf.h и string.h
- Определяются макросы: — MAX_INPUT_LENGTH — максимальная длина вводимой строки — #pragma pack(1, push) — инструкция компилятору о сохранении регистров при вызове функций — #pragma pack(pop) — восстановление предыдущего состояния упаковки регистров
- Определяются три функции: — input — считывает строку из стандартного ввода и возвращает индекс первого непустого символа — controlInput — обрабатывает введенную строку, проверяет корректность ввода и выводит десятичное представление числа — toDec — переводит строку в десятичное число, учитывая знак и масштабирование чисел с плавающей точкой
- Функция main начинается с инициализации строки для ввода и нулевого значения переменной start.
- Ввод строки осуществляется с помощью функции input, которая считывает строку и возвращает индекс первого непустого символа.
- Если первый символ строки — минус или плюс, то значение переменной start устанавливается равным 1.
- В цикле while выполняется проверка корректности введенной строки: если строка содержит только один символ и start равно 1, то выводится сообщение об ошибке и осуществляется повторный ввод строки.
- В цикле for проверяется каждый символ строки на принадлежность к допустимому набору чисел. Если символ не принадлежит к набору, то выводится сообщение об ошибке и осуществляется повторный ввод строки с обновленным значением start.
- Вызывается функция toDec для преобразования строки в десятичное число с учетом знака и масштабирования чисел с плавающей точкой.
- Выводится десятичное представление числа.