Как с помощью winapi перевести из строки в целое?
От: kirina  
Дата: 25.03.02 15:53
Оценка:
Как с помощью winapi перевести из строки в целое,
подскажите плиз...
Re: Как с помощью winapi перевести из строки в целое?
От: IT Россия linq2db.com
Дата: 25.03.02 16:21
Оценка:
Здравствуйте kirina, Вы писали:

K>Как с помощью winapi перевести из строки в целое,


Именно WinAPI? Тогда вот например VarR4FromStr.
Если нам не помогут, то мы тоже никого не пощадим.
Re: Как с помощью winapi перевести из строки в целое?
От: Игорь Вартанов https://mvp.support.microsoft.com/profile=3317CC31-AB7A-4D36-864E-47DEFF433151
Дата: 25.03.02 16:58
Оценка: 47 (5) :)
Здравствуйте kirina, Вы писали:

K>Как с помощью winapi перевести из строки в целое,

K>подскажите плиз...

Вообще-то это задача рантайма.

int i = atoi(str);

Но если хочется сугубо API, то хотя бы так:

#include <windows.h>
#include <ostream.h>

int StrToInt(LPCTSTR str)
{
    int res = 0;
    HINSTANCE hLib = LoadLibrary("msvcrt.dll");
    if(hLib)
    {
        int (*atoi)(LPCTSTR);
        *(FARPROC*)&atoi = GetProcAddress(hLib, "atoi");
        res = atoi(str);
        FreeLibrary(hLib);
    }
    return res;
}

void main()
{
    cout << StrToInt("12345") << endl;
}


или так (ну совсем криво...)

#include <windows.h>
#include <ostream.h>

int StrToInt(LPCSTR str)
{
    WritePrivateProfileString("temp", "num", str, "temp000.tmp");
    int i = GetPrivateProfileInt("temp", "num", 0, "temp000.tmp");
    WritePrivateProfileString("temp", NULL, NULL, "temp000.tmp");
    return i;
}

void main()
{
    cout << StrToInt("12345") << endl;
}


При наличии эдита можно воспользоваться SetDlgItemText + GetDlgItemInt.
---
С уважением,
Игорь
Re[2]: Как с помощью winapi перевести из строки в целое?
От: IT Россия linq2db.com
Дата: 25.03.02 17:07
Оценка:
Здравствуйте Игорь Вартанов, Вы писали:

ИВ>Но если хочется сугубо API, то хотя бы так:


[skip]

Да! Вот это как раз и называется Pure API!!!
Если нам не помогут, то мы тоже никого не пощадим.
Re: Как с помощью winapi перевести из строки в целое?
От: Serge Беларусь  
Дата: 26.03.02 07:18
Оценка:
Здравствуйте kirina, Вы писали:

K>Как с помощью winapi перевести из строки в целое,

K>подскажите плиз...

A shell — API подойдет????
Если подойдет, то <Shlwapi.h> а там есть и StrToInt и еще много всяких интересностей.
Если поставить вопрос ребром и посмотреть на него сверху, то сбоку может показаться, что снизу ничего не видно.
Re[2]: Как с помощью winapi перевести из строки в целое?
От: Lexey Россия  
Дата: 26.03.02 08:53
Оценка:
Здравствуйте Игорь Вартанов, Вы писали:

ИВ>
ИВ>#include <windows.h>
ИВ>#include <ostream.h>

ИВ>int StrToInt(LPCTSTR str)
ИВ>{
ИВ>    int res = 0;
ИВ>    HINSTANCE hLib = LoadLibrary("msvcrt.dll");
ИВ>    if(hLib)
ИВ>    {
ИВ>        int (*atoi)(LPCTSTR);
ИВ>        *(FARPROC*)&atoi = GetProcAddress(hLib, "atoi");
ИВ>        res = atoi(str);
ИВ>        FreeLibrary(hLib);
ИВ>    }
ИВ>    return res;
ИВ>}

ИВ>void main()
ИВ>{
ИВ>    cout << StrToInt("12345") << endl;
ИВ>}
ИВ>


Мда, ну ты извращенец.
"Будь достоин победы" (c) 8th Wizard's rule.
Re: Как с помощью winapi перевести из строки в целое?
От: Gambler  
Дата: 26.03.02 11:25
Оценка:
Здравствуйте kirina, Вы писали:

K>Как с помощью winapi перевести из строки в целое,

K>подскажите плиз...



int asci2int(LPCTSTR *str)
{
  if(NULL == str)
    return 0;

  int iRes = 0;
  LPCTSTR s = str;
  int sign = 1;

  // Добавь тримминг
  
  if('+' == s[0])
    s++;

  if('-' == s[0])
  {
    sign = -1;
    s++;
  }

  int slen = lstrlen(s);

  for(int i=0; i<slen; i++)
  {
    if(!IsDigit(s[i]))
    {
      iRes = 0;
      break;
    }

    iRes = (int(s[i]) - int('0')) + iRes * 10;
  }

  return (iRes * sign);
}


Типа так.
-------------------------------------------------------------------

Вызывает презедент к себе коров и говорит:
— Ну, что будем сдавать, молоко или мясо?
(с) Г. Явлинский TV6 — Герой дня (18.04.2002)
Re[3]: Как с помощью winapi перевести из строки в целое?
От: Аноним  
Дата: 26.03.02 14:38
Оценка:
Здравствуйте Lexey, Вы писали:

L>Здравствуйте Игорь Вартанов, Вы писали:


ИВ>>
ИВ>>#include <windows.h>
ИВ>>#include <ostream.h>

ИВ>>int StrToInt(LPCTSTR str)
ИВ>>{
ИВ>>    int res = 0;
ИВ>>    HINSTANCE hLib = LoadLibrary("msvcrt.dll");
ИВ>>    if(hLib)
ИВ>>    {
ИВ>>        int (*atoi)(LPCTSTR);
ИВ>>        *(FARPROC*)&atoi = GetProcAddress(hLib, "atoi");
ИВ>>        res = atoi(str);
ИВ>>        FreeLibrary(hLib);
ИВ>>    }
ИВ>>    return res;
ИВ>>}

ИВ>>void main()
ИВ>>{
ИВ>>    cout << StrToInt("12345") << endl;
ИВ>>}
ИВ>>


L>Мда, ну ты извращенец. :)))

Товарищи, используйте просто функцию atoi для целочисленных величин и atof для величин с плавающей точкой :)
Re[4]: Как с помощью winapi перевести из строки в целое?
От: Gambler  
Дата: 26.03.02 15:04
Оценка:
Здравствуйте Аноним, Вы писали:

А>Товарищи, используйте просто функцию atoi для целочисленных величин и atof для величин с плавающей точкой


Товарисч! Читайте ЗАГОЛОВОК!
-------------------------------------------------------------------

Вызывает презедент к себе коров и говорит:
— Ну, что будем сдавать, молоко или мясо?
(с) Г. Явлинский TV6 — Герой дня (18.04.2002)
Re: Как с помощью winapi перевести из строки в целое?
От: KMiNT21 Украина http://kmint21.info/ru/
Дата: 26.03.02 16:04
Оценка: 14 (1)
Здравствуйте kirina, Вы писали:

K>Как с помощью winapi перевести из строки в целое,

K>подскажите плиз...

Может хватит и такой функции:

int NORTL_8char_atoi(const char *s)
{
int i;
for (i=0;i<lstrlen(s);i++)
if (!((s[i]>='0')&&(s[i]<='9'))) return FALSE;

i=0;

i+=1*(-'0'+(unsigned char)s[lstrlen(s)-1]);

if (lstrlen(s)-2 <0 ) return i;
i+=10*(-'0'+(unsigned char)s[lstrlen(s)-2]);

if (lstrlen(s)-3 <0 ) return i;
i+=100*(-'0'+(unsigned char)s[lstrlen(s)-3]);

if (lstrlen(s)-4 <0 ) return i;
i+=1000*(-'0'+(unsigned char)s[lstrlen(s)-4]);

if (lstrlen(s)-5 <0 ) return i;
i+=10000*(-'0'+(unsigned char)s[lstrlen(s)-5]);

if (lstrlen(s)-6 <0 ) return i;
i+=100000*(-'0'+(unsigned char)s[lstrlen(s)-6]);

if (lstrlen(s)-7 <0 ) return i;
i+=1000000*(-'0'+(unsigned char)s[lstrlen(s)-7]);

if (lstrlen(s)-8 <0 ) return i;
i+=10000000*(-'0'+(unsigned char)s[lstrlen(s)-8]);

return i;
}
KMiNT21' Blog
http://kmint21.info/ru/
Re[2]: Как с помощью winapi перевести из строки в целое?
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 26.03.02 16:25
Оценка:
Здравствуйте KMiNT21, Вы писали:

KMNT>Может хватит и такой функции:

Если ее оптимизировать по скорости и кол-ву вызовов раз в 100 — хватит. А так — точно нет. Одно могу сказать — ни одно собеседование с таких кодом не пройти.

Печально.
Алексей Кирдин
Re[3]: Как с помощью winapi перевести из строки в целое?
От: IT Россия linq2db.com
Дата: 26.03.02 23:50
Оценка:
Здравствуйте Kaa, Вы писали:

KMNT>>Может хватит и такой функции:


Kaa>Если ее оптимизировать по скорости и кол-ву вызовов раз в 100 — хватит. А так — точно нет. Одно могу сказать — ни одно собеседование с таких кодом не пройти.


Думаю, это шутка, причём похлеще чем у IV
А вообще можно объявить конкурс на самый тупой/медленный/через-одно-место алгоритм преобразования строки в число, причём дополнительные сложности типа знаковость можно даже и убрать, главное, чтобы он работал

Так круто как у KMiNT21 у меня конечно не вышло, но кое-что получилось

#include "stdafx.h"
#include <iostream>

int my_a_to_my_i(const char *s);

int my_strlen(const char *s)
{
    if (!s)
        return my_a_to_my_i("0");

    int len = my_a_to_my_i("0");
    while (*s != my_a_to_my_i("0")) {
        len += my_a_to_my_i("1");;
        s   += my_a_to_my_i("1");
    }

    return len;
}

int my_a_to_my_i(const char *s)
{
    if (!s)
        return my_a_to_my_i("0");

    if (s == "0")
        return s[0] - '0';

    if (s == "1")
        return *s - '0';

    if (!my_strlen(s))
        my_a_to_my_i("0");

    if (my_strlen(s) == 1)
        return  - '0' + *s;

    int  res = 0;
    char two[2] = "0";
    for (
            int i =  my_a_to_my_i("0");
                i <  my_strlen(s);
                i += my_a_to_my_i("1")
        ) 
    {
        *two  = s[i];
        res <<= my_a_to_my_i("1");
        res  *= my_a_to_my_i("5");
        res  += my_a_to_my_i(two);
    }

    return res;
}

void main()
{
    std::cout 
        << my_a_to_my_i("123456")
        << std::endl;
}
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Как с помощью winapi перевести из строки в целое?
От: retalik www.airbandits.com/
Дата: 27.03.02 05:04
Оценка:
Здравствуйте IT, Вы писали:

IT>Так круто как у KMiNT21 у меня конечно не вышло, но кое-что получилось


Эх, хотел тебе за эту крутизну оценку поставить, но твой пример выдает пустую строку
Успехов,
Виталий.
Re[5]: Как с помощью winapi перевести из строки в целое?
От: IT Россия linq2db.com
Дата: 27.03.02 05:11
Оценка:
Здравствуйте retalik, Вы писали:

IT>>Так круто как у KMiNT21 у меня конечно не вышло, но кое-что получилось


R>Эх, хотел тебе за эту крутизну оценку поставить, но твой пример выдает пустую строку


Не может быть, у тебя что-то с параметрами компиляции, мой пример на них круто завязан
Как у тебя создаются строковые константы?
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: Как с помощью winapi перевести из строки в целое?
От: retalik www.airbandits.com/
Дата: 27.03.02 05:29
Оценка:
Здравствуйте IT, Вы писали:

IT>Здравствуйте retalik, Вы писали:


IT>>>Так круто как у KMiNT21 у меня конечно не вышло, но кое-что получилось


R>>Эх, хотел тебе за эту крутизну оценку поставить, но твой пример выдает пустую строку


IT>Не может быть, у тебя что-то с параметрами компиляции, мой пример на них круто завязан

IT>Как у тебя создаются строковые константы?
Скопировал весь текст в буфер, вставил в файл, удалил #include "stdafx.h" и вызвал
cl /MD test.cpp
Результат выполнения — пустая строка.

cl /ML test.cpp
То же самое.
Успехов,
Виталий.
Re: Как с помощью winapi перевести из строки в целое?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 27.03.02 08:58
Оценка:
Здравствуйте kirina, Вы писали:

K>Как с помощью winapi перевести из строки в целое,

K>подскажите плиз...


#include "windows.h"
#include <malloc.h>

int Str2Int(char * s)
{
  int len = strlen (s) + 1;
  LPWSTR s2 = (LPWSTR)alloca (len*2);
  MultiByteToWideChar (CP_ACP, 0, s, len, s2, len * 2);

  long res = 0;
  VarI4FromStr (s2, 0, LOCALE_NOUSEROVERRIDE, &res);
  return res;
}

void main()
{
  assert (Str2Int("111 234") == 111234);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.