Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Я начинающий, подскажите как...(Все вопросы начинающих - постить только здесь!!!)

1
24 ноября 2007 года
kot_
7.3K / / 20.01.2000
Эта тема предназначена для вопросов начинающих в программировании. Если вы только начинаете программировать и столкнулись с тем, что ваш HelloWord (как вариант - новая суперОС) - не компилируется по непонятной причине, хотя код вы один в один взяли из книжки (интернета, придумали сами), то скорей всего ваш вопрос НУЖНО размещать только в этой теме. Перед тем как его создать - обязательно воспользоваться поиском. Только в этой теме вы не рискуете нарваться на - RTFM, иди в ЧАВО, иди в гугль и в конце концов просто иди на ... - при условии конечно что в данной теме вопрос не задавался. Или если вы не задаете вопрос типа "расскажите мне подробно что такое шаблоны в С++" - т.е. вопрос, в ответ на который проще послать в вышеуказанное. Если же вы решили что, ваш вопрос настолько нов и свеж что никто до этого не спрашивал на форуме "как мне прочесть файл с использованием потока" и создали отдельную тему - не обессудьте - в лучшем случае тема будет закрыта, в худшем удалена - и вы получите нарушение.
Страницы:
33K
24 ноября 2007 года
g0rn
6 / / 23.11.2007
http://forum.codenet.ru/showthread.php?t=43547
Цитата: kot_

Допустима ли ситуация запуска двух копий program_1 или program_2? Если да - тогда необходимо искать процесс по имени и если запускается например program_2 - искать в процессах с именем program_1 и если он есть - завершать программу. Если по логике может быть запущена только одна копия программы - тогда используй мьютексы. Алгоритм такой если запускается program_1 - пытаешься создать мьютекс - если ошибка - мьютекс уже создан - ищешь в памяти и завершаешь процесс с именем program_2. Если запускается program_2 и таже ошибка - просто завершаешь процесс. Наличие третьей программы тут абсолютно ненужно.


Я так понимаю, что это для присутствующих исходников program_1 и program_2. Вот только проблема в том, что это 2 абсолютно сторонних приложения и их исходников у меня нет. Поэтому, видимо, нужна программа-перехватчик запуска, которая при запуске определенного процесса убивала бы нужный при необходимости. Тут-то и проблема. Также, как можно найти хэндл процесса для убивания через TerminateProcess() по имени его исполняемого файла?

1
24 ноября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: g0rn
http://forum.codenet.ru/showthread.php?t=43547

Я так понимаю, что это для присутствующих исходников program_1 и program_2. Вот только проблема в том, что это 2 абсолютно сторонних приложения и их исходников у меня нет. Поэтому, видимо, нужна программа-перехватчик запуска, которая при запуске определенного процесса убивала бы нужный при необходимости. Тут-то и проблема. Также, как можно найти хэндл процесса для убивания через TerminateProcess() по имени его исполняемого файла?


Это пример, не тестировался и не проверялся, писался с головы, но скорей всего должен быть рабочим. Не забывай делать проверку на успешность выполнения функций.

Код:
SomeFunc(){
...
void *hg;

unsigned long* pPid;
unsigned long result;

Handle hWnd = FindWindow(NULL,"program_2");//Ищем процесс
hg = GlobalAlloc(GMEM_SHARE,sizeof(unsigned long));
pPid = (unsigned long *)GlobalLock(hg);//Прежде чем чтолибо делать  - блокируем обязательно

result = GetWindowThreadProcessId(hWnd,pPid);//Получаем ид процесса
HANDLE ps = OpenProcess(1,false,*pPid);//открываеем(получаем хендл)
TerminateProcess(ps,-9);//прибиваем

GlobalUnlock(hg);//Не забываем снять блокировку
GlobalFree(hg);

 
}
30K
24 ноября 2007 года
FireFly[53]
16 / / 19.11.2007
Как получить метку unix time произвольной даты?

Ну то бишь, мне нужно знать сколько секунд пройдет с "00:00:00 January 1, 1970" (UTC) до, например, 15 января 2018 года? Перерыл MSDN ничего толкового не нашел, кроме получения текущей метки ... :(
33K
24 ноября 2007 года
g0rn
6 / / 23.11.2007
Цитата: kot_
Это пример, не тестировался и не проверялся, писался с головы, но скорей всего должен быть рабочим. Не забывай делать проверку на успешность выполнения функций.


Хм.. Вот мой код:

Код:
#include "stdafx.h"

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    void *hg;

    unsigned long* pPid;
    unsigned long result;

    HANDLE hWnd = FindWindow(NULL,"program_2");//Ищем процесс
    hg = GlobalAlloc(GMEM_SHARE,sizeof(unsigned long));
    pPid = (unsigned long *)GlobalLock(hg);//Прежде чем чтолибо делать  - блокируем обязательно

    result = GetWindowThreadProcessId(hWnd,pPid);//Получаем ид процесса
    HANDLE ps = OpenProcess(1,false,*pPid);//открываеем(получаем хендл)
    TerminateProcess(ps,-9);//прибиваем

    GlobalUnlock(hg);//Не забываем снять блокировку
    GlobalFree(hg);

    return 0;
}

При компиляции выдает:
Цитата:
{путь}\program.cpp(17) : error C2664: 'GetWindowThreadProcessId' : cannot convert parameter 1 from 'void *' to 'struct HWND__ *'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast

1
24 ноября 2007 года
kot_
7.3K / / 20.01.2000
Ну я же написал что код не тестировал. Пример тебе дали - разбирайся сам. Я сейчас попробовал - все нормально работает - скорей всего проблема в том что тебе вместо HANDLE нужно использовать HWND, так как ты программируешь в VC++.
30K
24 ноября 2007 года
FireFly[53]
16 / / 19.11.2007
Код:
#include <time.h>
#include <stdio.h>

int main()
{
    time_t ltime, newtime;
   
    struct tm mytime;
    mytime.tm_sec=0;
    mytime.tm_min=0;
    mytime.tm_hour=0;
    mytime.tm_mday=22;
    mytime.tm_mon=10;
    mytime.tm_year=2007-1900;

    newtime=mktime(&mytime);
    time( &ltime );
    printf( "Days:\t%ld\n\n", (ltime-newtime)/(60*60*24) );

}
Сам разобрался ... mktime возвращает значение типа time_t из структуры tm, unix time.
1
24 ноября 2007 года
kot_
7.3K / / 20.01.2000
Вот кстати специально для тебя ссылочка. Какраз полностью что тебе нужно. Я думаю как применить это к твоему случаю проблемы не составит?
33K
24 ноября 2007 года
g0rn
6 / / 23.11.2007
Да, спасибо большое, с HWND все работает. Теперь еще один вопрос, надеюсь последний:
FindWindow() ищет процесс по заголовку окна. Но в program_2 (которую надо убивать) заголовок постоянно динамический, предугадать его возможности нет, он меняется во время работы в зависимоти от действий юзера, однако само имя процесса всегда одно и то же (program_2.exe). Как можно искать не по заголовку окна, а по названию процесса?

PS: за ссылку спасибо, поизучаю..
1
24 ноября 2007 года
kot_
7.3K / / 20.01.2000
Ну так по той ссылке и смотри. Получаешь имя процесса и прибиваешь его по имени.
33K
25 ноября 2007 года
g0rn
6 / / 23.11.2007
Сделал вот такую вещь:
Код:
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <stdio.h>

//  Forward declarations:
BOOL GetProcessList( );

void main( )
{
  GetProcessList( );
}

BOOL GetProcessList( )
{
  HANDLE hProcessSnap;
  HANDLE hProcess;
  PROCESSENTRY32 pe32;

  // Take a snapshot of all processes in the system.
  hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );

  // Set the size of the structure before using it.
  pe32.dwSize = sizeof( PROCESSENTRY32 );

  // Retrieve information about the first process,
  // and exit if unsuccessful
  if( !Process32First( hProcessSnap, &pe32 ) )
  {
    CloseHandle( hProcessSnap );          // clean the snapshot object
    return( FALSE );
  }

  // Now walk the snapshot of processes, and
  // display information about each process in turn
  do
  {
    printf( pe32.szExeFile );
    printf( "\n");
    if (pe32.szExeFile == "program_2.exe")
    {
        printf("Вхожу в условие");
        hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );
        if (hProcess)
        {
            TerminateProcess(hProcess, -9);
            CloseHandle(hProcess);
        }
    }


  } while( Process32Next( hProcessSnap, &pe32 ) );

  CloseHandle( hProcessSnap );
  return( TRUE );
}

Список процессов выводит, но вот в условие pe32.szExeFile == "program_2.exe" почему-то не входит, хотя program_2.exe точно есть в памяти и в списке процессов выводится:confused:


UPD: Разобрался, strstr() помог..
34K
26 ноября 2007 года
pms
1 / / 26.11.2007
нету не у кого примера программы "Блокировки Клавиатуры" :rolleyes:
зы
заранее спасибо.
1
26 ноября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Ation
gorn, при (pe32.szExeFile == "program_2.exe") ты сравниваешь указатели на область динамической и статической памяти соответственно. Или используй классы строк с перегруженным оператором == (CString, string), или используй функции сравнения строк (strcmp).


Сообщения читаем внимательно, а не только для того что бы запостить. Человек написал - что он сам разобрался.

34K
28 ноября 2007 года
KillMen
3 / / 28.11.2007
А как можно изменить IP заголовок?
34K
29 ноября 2007 года
KillMen
3 / / 28.11.2007
Я написал библиотеку для изменения IP адресса но при запуске программа выдает что инструкция обратилась не по тому адресу что делать?
Код:
//================test.cpp========================
#include "IP.h"
int main()
{
  Soket a;
  a.ConstructIPHeader(IpProtocol_UDP,
IpFragFlag_DONT_FRAG,IP_DEF_TTL,GetCurrentProcessId());
  a.SetIPHeaderAddress( "127.0.0.1", "127.0.0.1" );
  a.SendBuf( "123", 3 );
  return 0;
}

//=====================IP.H==============================
Код:
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment (lib, "C:\\Program Files\\Microsoft Visual Studio\\VC98\\Lib\\WSOCK32.LIB")  
//////////////////////////////////////////////////////////////////
//                                                              //
//                          IP Header                           //
//              Implementation of RFC791 IP Header              //
//                                                              //
//////////////////////////////////////////////////////////////////
#define PseudoHeaderLength sizeof(PseudoHeader)
#define IpHeaderLength sizeof(IpHeader)
#define IpVersion 4
//Service types
#define IpService_NETWORK_CONTROL 111
#define IpService_INTERNETWORK_CONTROL 110
#define IpService_CRITIC_ECP 101
#define IpService_FLASH_OVERIDE 100
#define IpService_FLASH 011
#define IpService_IMMEDIATE 010
#define IpService_PRIORITY 001
#define IpService_ROUTINE 0
//Internet protocols
#define IpProtocol_ICMP 1
#define IpProtocol_TCP 6
#define IpProtocol_UDP 17
//Fragmetation flag
#define IpFragFlag_MAY_FRAG 0x0000
#define IpFragFlag_MORE_FRAG 0x2000
#define IpFragFlag_LAST_FRAG 0x5000
#define IpFragFlag_DONT_FRAG 0x4000

#define IP_DEF_TTL 128

struct PseudoHeader //&#209;&#242;&#240;&#243;&#234;&#242;&#243;&#240;&#224; &#239;&#241;&#229;&#226;&#228;&#238; &#231;&#224;&#227;&#238;&#235;&#238;&#226;&#234;&#224;
{
  unsigned int SourceAddress;
  unsigned int DestinationAddress;
  unsigned char Zeros;
  unsigned char PTCL;
  unsigned short Length;
};



struct IpHeader //&#209;&#242;&#240;&#243;&#234;&#242;&#243;&#240;&#224; IP &#231;&#224;&#227;&#238;&#235;&#238;&#226;&#234;&#224;
{
  unsigned char HeaderLength_Version;
  unsigned char TypeOfService; // Type of service
  unsigned short TotalLength; // total length of the packet
  unsigned short Identification; // unique identifier
  unsigned short FragmentationFlags; // flags
  unsigned char TTL; // Time To Live
  unsigned char Protocol; // protocol (TCP, UDP etc)
  unsigned short CheckSum; // IP Header checksum

  unsigned int sourceIPAddress; // Source address
  unsigned int destIPAddress; // Destination Address

};

class Soket
{
  sockaddr_in m_TargetAddress;
  int m_SpoofSocket;
  IpHeader FAR * IpH;
  PseudoHeader FAR * PsH;
  unsigned short CalculateChecksum( unsigned short * usBuf, int iSize );

public:
  ~Soket();
  Soket();
  void ConstructIPHeader( unsigned char ucProtocol, unsigned short usFragmentationFlags, unsigned short usTTL,
       unsigned short usIdentification );
  void SetIPHeaderAddress( LPCSTR lpSourceAddress, LPCSTR lpDestinationAddress );
  unsigned short PseudoChecksum();
  void SendBuf( char * buf, int len );
};

Soket::~Soket()
{
closesocket(m_SpoofSocket);
WSACleanup();
}

Soket::Soket()
{
    WSAData WSADat;
    WSAStartup( 0x0202, & WSADat );
    m_TargetAddress.sin_family = AF_INET;
    m_TargetAddress.sin_port = 0;
    PsH->Zeros = 0;
}
void Soket::ConstructIPHeader( unsigned char ucProtocol, unsigned short usFragmentationFlags, unsigned short usTTL,
     unsigned short usIdentification )
     {
       m_SpoofSocket = socket( AF_INET, SOCK_RAW, ucProtocol );
       unsigned int iTrue = 1;
       setsockopt( m_SpoofSocket, IPPROTO_IP, IP_HDRINCL, ( char * ) & iTrue, sizeof( iTrue ) );
       IpH->HeaderLength_Version = IpHeaderLength / 4 + IpVersion * 16;
       IpH->Protocol = ucProtocol;
       PsH->PTCL = ucProtocol;
       IpH->FragmentationFlags = htons( usFragmentationFlags );
       //Time to live
       IpH->TTL = usTTL;
       //Checksum - set to 0
       IpH->CheckSum = 0;
       //&#200;&#228;&#229;&#237;&#242;&#232;&#244;&#232;&#234;&#224;&#246;&#232;&#255;
       IpH->Identification = htons( usIdentification );
       //&#207;&#240;&#232;&#238;&#240;&#232;&#242;&#229;&#242;
       IpH->TypeOfService = IpService_ROUTINE;
}

void Soket::SetIPHeaderAddress( LPCSTR lpSourceAddress, LPCSTR lpDestinationAddress )
{

  IpH->sourceIPAddress = inet_addr( lpSourceAddress );
  PsH->SourceAddress = inet_addr( lpSourceAddress );
  //&#192;&#228;&#240;&#229;&#241;&#241; &#237;&#224;&#231;&#237;&#224;&#247;&#229;&#237;&#232;&#255;
  IpH->destIPAddress =inet_addr( lpDestinationAddress );
  m_TargetAddress.sin_addr.s_addr = inet_addr( lpDestinationAddress );
  PsH->DestinationAddress = inet_addr( lpDestinationAddress );
}

unsigned short Soket::CalculateChecksum( unsigned short * usBuf, int iSize )
{
  unsigned long usChksum = 0;
  //Calculate the checksum
  while ( iSize > 1 )
  {
    usChksum += * usBuf++;
    iSize -= sizeof( unsigned short );
  }
  //If we have one char left
  if ( iSize )
    usChksum += * ( unsigned char * ) usBuf;
  //Complete the calculations
  usChksum = ( usChksum >> 16 ) + ( usChksum & 0xffff );
  usChksum += ( usChksum >> 16 );
  //Return the value (inversed)
  return ( unsigned short ) ( ~usChksum );
}

void Soket::SendBuf( char * buf, int len )
{
  PsH->Length = len;
  int iTotalLength = IpHeaderLength + len;
  IpH->TotalLength = htons( iTotalLength );
  char * newBuf = new char[iTotalLength];
  memcpy( newBuf, IpH, IpHeaderLength );
  memcpy( newBuf + IpHeaderLength, buf, len );
  IpH->CheckSum = CalculateChecksum( ( unsigned short * ) newBuf, iTotalLength );
  memcpy( newBuf, IpH, IpHeaderLength );
  sendto( m_SpoofSocket, ( const char * ) newBuf, iTotalLength, 0, ( sockaddr * ) & m_TargetAddress,
       sizeof( m_TargetAddress ) );
}



unsigned short Soket::PseudoChecksum()
{
  unsigned short Checksum = CalculateChecksum( ( unsigned short * ) PsH, PsH->Length );
  return Checksum;
}[CODE][CODE]
[/CODE]
[/CODE]
1
30 ноября 2007 года
kot_
7.3K / / 20.01.2000
У вас объявлен указатель на структуры IpHeader FAR * IpH; и PseudoHeader FAR * PsH; - но они нигде не создаются. Поетому и ошибка.
Т.е. в конструкторе сокета должно присутствовать чтото типа:
 
Код:
IpH = new IpHeader();

и соответственно необходимо не забыть объявить конструктор для структуры. Примерно так. Пробуйте.
23K
30 ноября 2007 года
MurzET
13 / / 02.07.2007
Стыдно писать на форуме такой тупой вопрос, но все же .

Есть значение summ типа double . Перевожу его в char . Пишу
 
Код:
Edit1->Text=(*char)summ;

- не подходит .
Пишу
 
Код:
Edit1->Text=(char)summ;

-та же хрень .

Главное, в обоих случаях программа компилируется, но в нужных полях пишутся непонятные значки .
23K
30 ноября 2007 года
MurzET
13 / / 02.07.2007
Пробовал так:
 
Код:
char *a,*b;
iter++;
summ=summ+1/iter;
*a=(char)summ;
*b=(char)iter;
Edit1->Text=a;
Edit2->Text=b;


Нихрена .
1
30 ноября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: MurzET
Пробовал так:
 
Код:
char *a,*b;
iter++;
summ=summ+1/iter;
*a=(char)summ;
*b=(char)iter;
Edit1->Text=a;
Edit2->Text=b;


Нихрена .



 
Код:
Edit1->Text = FloatToStr(summ);
34K
01 декабря 2007 года
Vergill
5 / / 01.12.2007
А есть в C++ вариант сотворить так, чтобы программа после выполнения не вылетала в никуда, например для вывода информации?
34K
02 декабря 2007 года
___petya___
1 / / 02.12.2007
Есть три вопроса:
1. Как получать код вводимого с клавиатуры символа сразу после нажатия на клавишу(ввод из консоли)? Console.Read возвращает введённый символ только после нажатия на Enter. Ввод пароляя целиком (одной строкой) не подойдёт, т.к. нужно запоминать время ввода каждого символа.
2. Как подавлять вывод вводимых символов на экран или заменять их на звёздочки?
3. Следующий фргамент кода, написанный в тяжких мучениях :), должен хэшировать вводимую с клавиатуры строку. Однако cryptoStream.Read возвращает 0. Не понимаю решительно, в чём проблема.

string input = Console.ReadLine();

MemoryStream stringInMemory = new MemoryStream();
stringInMemory.Capacity = 10000;

StreamWriter writer = new StreamWriter( stringInMemory );
writer.AutoFlush = true;
writer.WriteLine( input );

HashAlgorithm hashAlgorithm = new SHA1CryptoServiceProvider();
ICryptoTransform cryptoTransform = (hashAlgorithm as ICryptoTransform);

CryptoStream cryptoStream = new CryptoStream( stringInMemory , cryptoTransform , CryptoStreamMode.Read );

int result;
byte[] hash = new byte[ 20 ];
result = cryptoStream.Read( hash , 0 , 20 );

Где косяк?

Если кто-нибудь подскажет способ для преобразования типа string в тип byte[] буду крайне признателен.
16K
05 декабря 2007 года
10111
5 / / 05.05.2006
Доброго времени суток всем участникам форума!

Господа,подскажите пожалуйста алгоритм нахождения пифагоровых
троек чисел,вроде бы тривиальная задача,а бьюсь с нею уже вторые
сутки не могу решить,прошу о помощи!
15K
05 декабря 2007 года
kant
64 / / 02.06.2007
Привет.
У меня такой вопрос , вот в некоторых исходниках бывает (int*)peremennaya или (SOCKEADDR*)&adr ну так вопрос что это означает ??
1.9K
06 декабря 2007 года
max_dark
256 / / 11.11.2005
Цитата:
в некоторых исходниках бывает (int*)peremennaya или (SOCKEADDR*)&adr ну так вопрос что это означает ?


Это преобразование типов
(int*) - к указателю на int
(SOCKEADDR*) - к указателю на SOCKEADDR

370
06 декабря 2007 года
koval
443 / / 29.08.2005
Цитата: kant
Привет.
У меня такой вопрос , вот в некоторых исходниках бывает (int*)peremennaya или (SOCKEADDR*)&adr ну так вопрос что это означает ??



Я так понял это ты про С/С++. Так вот * означает указатель на тип, а & это унарный оператор возвращающий адресс. А лучше возми учебное руководство по С или С++ и внимательно изучи, потому-что это основы синтаксиса языка.

1.8K
11 декабря 2007 года
igor_nf
256 / / 13.12.2006
Возник такой вопрос. Сразу оговорю - интересует реализация на языке Си. Как можно написать функцию, которая подсчитает количество бит, выделенное для хранения определённого объекта? Предполагается, что функция ничего не знает о типе объекта(ну что-то типа оператора sizeof). Также желательна машинно-независимая реализация(ну или любая на крайний случай). Заранее спасибо.
6.0K
11 декабря 2007 года
artyom-tyanutov
107 / / 10.07.2006
Какаим макаром конвертить строку в base64???
А то исходник в принципе я нашел, да разобраться очень хочется)))
Пишу с использованием Qt.
361
11 декабря 2007 года
Odissey_
661 / / 19.09.2006
Цитата:
Какаим макаром конвертить строку в base64???
А то исходник в принципе я нашел, да разобраться очень хочется)))
Пишу с использованием Qt.


С помощью Qt?

 
Код:
QByteArray text("Qt is great!");
 text.toBase64();        // returns "UXQgaXMgZ3JlYXQh"
6.0K
12 декабря 2007 года
artyom-tyanutov
107 / / 10.07.2006
Цитата: Odissey_
С помощью Qt?
 
Код:
QByteArray text("Qt is great!");
 text.toBase64();        // returns "UXQgaXMgZ3JlYXQh"



Большое спасибо!
По запросу base64 Assistant что-то нашел только fromBase64 (((

33K
13 декабря 2007 года
aureliano82
9 / / 12.12.2007
CryptoStream почему-то перестал шифровать.. ума не приложу, что не так, подскажите, плз)

Код:
byte[] bin = new byte[len];

...

MemoryStream msEncrypt = new MemoryStream(bin);
SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
rijn.Key = new byte[32] { ... };
rijn.IV = new byte[16] { ... };
CryptoStream encStream = new CryptoStream(msEncrypt, rijn.CreateEncryptor(rijn.Key, rijn.IV), CryptoStreamMode.Write);
encStream.Write(bin, 0, len);
//encStream.FlushFinalBlock();
encrypted = new byte[len];
msEncrypt.Position = 0;
msEncrypt.Read(encrypted, 0, len);
//encStream.Close();
msEncrypt.Close();


во-первых, на выходе получаем, что массив encrypted совпадает с исходным bin
а во-вторых, при попытке закрыть поток encStream (или сделать FlushFinalBlock) ругается на размер потока ("Memory stream is not expandable." либо "Length of the data to decrypt is invalid." - через раз) :confused:
12K
16 декабря 2007 года
Sholah_Weras
99 / / 04.12.2007
Очень стыдно за вопрос, но в нете найти так и не смог.

1. Ищем нужный символ в строке (пробел)
2. От этого символа начинаем проверять все последущие символы, записывая их в отдельную переменную. Копируем, пока не встретим другой, нужный символ.

Какие ф-ии надо использовать для решения такой задачи? Если можно, то дайте, пожалуйста, ссылку на пример.
35K
16 декабря 2007 года
Nadegda
1 / / 16.12.2007
Здравствуйте!!подскажите пожалуйста как написать программу: удалить из массива все повторяющиеся элементы.
заранее спасибо
33K
17 декабря 2007 года
aureliano82
9 / / 12.12.2007
2 Nadegda
например, так:
Код:
int[] data = new int[n];
// ...
// создаем массив индексов
// 0 - такого элемента не было, 1 - повтор
byte[] inx = byte[n];
foreach (byte a in inx)  a = 0;
// счетчик количества неповторов (сразу посчитали первый элемент)
int s = 1;
for (int i = 0; i < n; i++)
  if (inx != 1)
    for (int j = i+1; j < n; j++)
      if (data == data[j])  inx[j] = 1;
      else s++;
// создаем "чистый" массив
int[] dataClr = new int;
int j = 0;
for (int i = 0; i < n; i++)
  if (inx = 0) {
    dataClr[j] = data;
    j++;
  }
33K
17 декабря 2007 года
aureliano82
9 / / 12.12.2007
Цитата: Sholah_Weras

1. Ищем нужный символ в строке (пробел)
2. От этого символа начинаем проверять все последущие символы, записывая их в отдельную переменную. Копируем, пока не встретим другой, нужный символ.
Какие ф-ии надо использовать для решения такой задачи? Если можно, то дайте, пожалуйста, ссылку на пример.



класс string
методы IndexOf() и обращение по индексу - больше ничго для локального счастья не нужно будет))

16K
19 декабря 2007 года
HolyDel
11 / / 03.03.2006
Цитата: Sholah_Weras
Очень стыдно за вопрос, но в нете найти так и не смог.

1. Ищем нужный символ в строке (пробел)
2. От этого символа начинаем проверять все последущие символы, записывая их в отдельную переменную. Копируем, пока не встретим другой, нужный символ.

Какие ф-ии надо использовать для решения такой задачи? Если можно, то дайте, пожалуйста, ссылку на пример.



Цитата:
класс string
методы IndexOf() и обращение по индексу - больше ничго для локального счастья не нужно будет))


зачем string? несложно и родным char-овским массивом обойтись.

пример
char* str="itemgassing 120";//что то мне кажется что задача сводится именно е етому - чтение значение перменной из файла
char* nstr; //тут будем хранить значение новой строки (то что после побела)
int i;
for(i=0;i<=strlen(str);i++)
{
if(str=' ')//коли уж у нас пробел
strcpy(nstr,str+(i+1)*sizeof(char),(strlen(str)-i-1)*sizeof(char))//копируем в nstr из str+i - i - ето смещение на i размеров char. + 1- чтобы не считать пробел.
//strlen(str) - скока всего символов в строке
}

собственно ето все писалось в браузере, такчто заранее приношу извинения за очепятки (сама идея вроде верна)

11
19 декабря 2007 года
oxotnik333
2.9K / / 03.08.2007
Цитата: HolyDel
зачем string? несложно и родным char-овским массивом обойтись.

пример
char* str="itemgassing 120";//что то мне кажется что задача сводится именно е етому - чтение значение перменной из файла
char* nstr; //тут будем хранить значение новой строки (то что после побела)
int i;
for(i=0;i<=strlen(str);i++)
{
if(str=' ')//коли уж у нас пробел
strcpy(nstr,str+(i+1)*sizeof(char),(strlen(str)-i-1)*sizeof(char))//копируем в nstr из str+i - i - ето смещение на i размеров char. + 1- чтобы не считать пробел.
//strlen(str) - скока всего символов в строке
}

собственно ето все писалось в браузере, такчто заранее приношу извинения за очепятки (сама идея вроде верна)




а если не один пробел будет, а 2 или 3 ?

16K
19 декабря 2007 года
HolyDel
11 / / 03.03.2006
мне почему то показалось что по условию - один пробел.
собственно выйти из цикла обычным способом - break при первом попавшемся пробеле, елси нужен отсчет от последнего - то for(i=strlen(str);i>=0;i--).
а вот еще интересный способ:

for(int i=0,bool is_exit=false;(i<=strlen(str))&&(!is_exit);i++)
{
...
}
тока я еще его не проверял на работоспособность.
11
19 декабря 2007 года
oxotnik333
2.9K / / 03.08.2007
Цитата: HolyDel
мне почему то показалось что по условию - один пробел.



про один пробел не говорилось... а он может быть 10-й по счету
ЗЫ: алгоритм надо рассчитывать "на дурака" либо запрещать вводить более одного пробела

16K
19 декабря 2007 года
HolyDel
11 / / 03.03.2006
Цитата:

про один пробел не говорилось...


совершенно верно, поетому я и сказал, что мне показалось :)

33K
19 декабря 2007 года
aureliano82
9 / / 12.12.2007
я написал про использование String, потому что считаю, что это удобно, а кроме того они формируются для динамической длины и, соответственно, не нужно думать, сколько памяти под это потребуется (опять-таки удобство) ;-)

Код:
// собсно исходная строка
String* str = S"Now is the time for all good men to come to the aid of their party.";
// начальный и конечный разделители
char startSimb = ' ';
char endSimb = ' ';
// начало конец куска нужного строки
int start, end;
start = str->IndexOf(startSimb, 0);
end = str->IndexOf(endSimb, start);
// формируем подстроку
String* substr = str->Substring(start,end);
// получим слово is
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог