Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 11.11.2014, 22:51   #1
ChronoArt
Новичок
Джуниор
 
Регистрация: 10.11.2014
Сообщений: 6
По умолчанию Перевод char в long и обратно! Начинающий уровень

может кто помочь с такой задачей? в другой ветке форума не отвечают(

http://www.programmersforum.ru/showthread.php?t=268212
ChronoArt вне форума
Старый 11.11.2014, 22:56   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

чистый си без плюсов?
перевод строки char* в число?
их есть у меня!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума
Старый 11.11.2014, 23:05   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Код:
// Проверка: строка есть целое десятичное число
bool StrIsDec(string S)
{
  if (!*S) return false; // строка пустая?
  if (*S == '0') return false; // с нуля - только восьмеричные числа
  if ((*S == '-') || (*S == '+')) S++; // Впереди может быть знак минус или плюс
  
  while (*S)
    if (!CharInCharset(*S++, DecDigits)) return false;
    
  return true;
}

// Проверка: строка есть целое шестнадцатеричное число
bool StrIsHex(string S)
{
  if (!*S) return false; // строка пустая?
  if (strnicmp(S, "0x", 2)) return false; // строка начинается на (0x | 0X)?

  S += 2; // Продвигаю указатель на 2 символа (пропускаю 0x)

  while (*S)
    if (!CharInCharset(*S++, HexDigits)) return false;

  return true;
}

// Проверка: строка есть целое восьмеричное число
bool StrIsOct(string S)
{
  if (!*S) return false; // строка пустая?
  if (strncmp(S, "0", 1)) return false; // строка начинается на 0?

  while (*S)
    if (!CharInCharset(*S++, OctDigits)) return false;

  return true;
}

// Проверка: строка есть число с плавающей точкой (дробное)
bool StrIsFloat(string S)
{
  int eCount = 0;

  if (!*S) return false; // строка пустая?
  if ((*S == '-') || (*S == '+')) S++; // Впереди может быть знак минус или плюс

  // Строка должна начинаться цифрой (если есть знак - после знака):
  if (!CharInCharset(*S, DecDigits)) return false;
  
  // Строка должна кончаться цифрой:
  if (!CharInCharset(S[strlen(S) - 1], DecDigits)) return false;
  
  // Десятичная точка может быть одна или не быть совсем
  if (GetCharCount('.', S) > 1) return false;
  
  // Показатель 10^x (e или E) может быть только 1 шт.
  eCount = GetCharCount('e', S) + GetCharCount('E', S);
  if (eCount > 1) return false;

  // Проверка валидности символов
  while (*S)
    if (!CharInCharset(*S++, FloatSymbols)) return false;

  return true;
}

// Перевод строки в 16-битное целое со знаком.
// Возвращает true, если строка есть (10-чное | 16-чное | 8-чное)
bool TryStr2Int(string S, int* Value)
{
  string Format;
  if (StrIsDec(S)) Format = "%d";
  else if (StrIsHex(S)) Format = "0x%x";
       else if (StrIsOct(S)) Format = "%o";
            else return false;

  return sscanf(S, Format, Value);
}

// Перевод строки в 32-битное целое со знаком.
// Возвращает true, если строка есть (10-чное | 16-чное | 8-чное)
bool TryStr2Long(string S, long* Value)
{
  string Format;
  if (StrIsDec(S)) Format = "%ld";
  else if (StrIsHex(S)) Format = "0x%lx";
       else if (StrIsOct(S)) Format = "%lo";
            else return false;

  return sscanf(S, Format, Value);
}

// Перевод строки в десятичное (с пл. точкой) со знаком
bool TryStr2Float(string S, float* Value)
{
  //AddStr2Log(S, "S"); // для отладки

  if (StrIsFloat(S))
    return sscanf(S, "%f", Value);
  else
    return false;
}

// Перевод строки в десятичное (с пл. точкой) со знаком двойной точности
bool TryStr2Double(string S, double* Value)
{
  //AddStr2Log(S, "S");

  if (StrIsFloat(S))
    return sscanf(S, "%lf", Value);
  else
    return false;
}

// Проверка длины введённого числа на разрядность
bool CheckIntLength(string Value, char BitCount)
{
  string Limit; // Эталон

  // ----------- 16-битные ------------
  if (BitCount == 16)
  {
    if (StrIsDec(Value)) // Десятичные
    {
      if (*Value == '-')           Limit = "-32768";  // отрицательное
      else if (*Value == '+')      Limit = "+32767";  // положительное с плюсом
             else                  Limit = "32767";   // положительное, начинающееся с цифры
    } // if
    else if (StrIsHex(Value))      Limit = "0xFFFF";  // 16-ричные
         else if (StrIsOct(Value)) Limit = "0177777"; // 8-ричные
                else return false;                    // Ваще не число!
  } // if (BitCount == 16)
  
  // ----------- 32-битные ------------
  else
  {
    if (StrIsDec(Value)) // Десятичные
    {
      if (*Value == '-')           Limit = "-2147483648";  // отрицательное
      else if (*Value == '+')      Limit = "+2147483647";  // положительное с плюсом
             else                  Limit = "2147483647";   // положительное, начинающееся с цифры
    } // if
    else if (StrIsHex(Value))      Limit = "0xFFFFFFFF";   // 16-ричные
         else if (StrIsOct(Value)) Limit = "37777777777";  // 8-ричные
                else return false;                         // Ваще не число!
  } // else
  
  //--- Вывод в лог ----
  //AddStr2Log(Value, "Value");
  //AddStr2Log(Limit, "Limit");

  // сразу на выход, если длина строки не равна длине эталона
  // функция strcmpi() выдаёт тогда неверный результат, а мне оно не надо
  if (strlen(Limit) < strlen(Value)) return false;
  if (strlen(Limit) > strlen(Value)) return true;
  
  // И только при равенстве длин этих строк их можно нормально сравнивайть побайтно
  if (strcmpi(Value, Limit) > 0) return false;
  else return true;
}
Вложения
Тип файла: rar C--.rar (15.4 Кб, 11 просмотров)
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума
Старый 12.11.2014, 07:23   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А вот кросспосты не приветствуются.
I'm learning to live...
Stilet вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод char в long и обратно! Начинающий уровень ChronoArt Общие вопросы C/C++ 9 13.11.2014 17:20
Перегрузка операторов (работа с матрицей в шаблонном классе) Начинающий уровень Ostor Общие вопросы C/C++ 2 11.11.2014 19:06
Передать из массива char в переменную long? ATAMAN200 Общие вопросы C/C++ 2 05.03.2013 18:50
String в array of Char и обратно. _PROGRAMM_ Общие вопросы Delphi 4 22.11.2011 22:10
перевод строки в long long и обратно Dimarik Общие вопросы C/C++ 9 16.09.2009 13:27