[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. Jest

    Jest New Member

    Joined:
    4 Oct 2010
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
    Всё поправил, но вместо 22 ошибок вылезло всего 5:
    Code:
    C:\Äëÿ Ñ++\newsreader1\newsreader1.cpp(60) : error C2039: 'cout' : is not a member of 'std'
    C:\Äëÿ Ñ++\newsreader1\newsreader1.cpp(60) : error C2039: 'atoi' : is not a member of 'std'
    C:\Äëÿ Ñ++\newsreader1\newsreader1.cpp(60) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type '' (or there is no acceptable conversion)
    C:\Äëÿ Ñ++\newsreader1\newsreader1.cpp(62) : error C2039: 'cout' : is not a member of 'std'
    C:\Äëÿ Ñ++\newsreader1\newsreader1.cpp(62) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type '' (or there is no acceptable conversion)
     
  2. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    187
    Reputations:
    5
    а вообще при работе со строками советую работать с библиотекой что парсит нужный тебе текст
    В твоем случае я бы внес в одну строчку
    например:

    char Buffer[]=""<html><head><title>lol</title></head>\
    <body><table><td class=\"num\">416</td></table>\
    </body></html>"";
    char met[]=""<td class=\"num\">"";
    char Answer[50];

    if(cut_str_to_char(Buffer, met, '<', Answer, 50))
    cout << Answer;
    else
    count << "Error";
     
    #5842 rudi, 27 Nov 2010
    Last edited: 27 Nov 2010
  3. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Значит не все, #include добавил необходимые? Строку using namespace std убрал? Надо было мой код целиком копировать.
     
  4. Jest

    Jest New Member

    Joined:
    4 Oct 2010
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
    Code:
    // newsreader1.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <windows.h>
    #include <wininet.h>
    #pragma comment(lib,"wininet")
    #include <stdlib.h>
    #include "fun.h"
    #include <fstream.h>	
    #include <iostream.h>
    #include <locale.h>
    #include <stdlib.h>
    #include <string>
    #include <math.h>
    using namespace std; 
    
    int main(int argc, char* argv[])
    {
    	char login[32], pass[32], req[5000];
    	cout << "Login: ";
    	cin >> login;
    	cout << endl << "Password: ";
    	cin >> pass;
    	
    	conect(login,pass);
    	FILE *fp;
        char buf[5000], *p;
        int c;
        const char *fname = "page.html";
        
        if ((fp = fopen(fname, "rb")) == NULL)
            return 1;
        for (p = buf; p-buf < 5000-1 && (c = getc(fp)) != EOF; p++)
            *p = c;
        *p = '\0';
        //printf("%s", buf);
        fclose(fp);
    	
    	if(strstr(buf,"login")==NULL){
    		cout << "\nDone!\n";
    	}
    	else{
    		cout << "\nLogin error\n";
    		return 1;
    	}
    
    
    	/*char *search="<h1>";
    	char *mbuf; //òóò òåêñò, áîëüøîé
    	mbuf=strstr(buf,search);
    	mbuf=strtok(mbuf,"<b");
    	mbuf=strtok(mbuf,"h1>");		
    	cout << "Village: " << mbuf << endl;
    	//goGet("","/build.php?id=1");*/
    
    
    	std::string text("<html><head><title>lol</title></head><body><table><td class=\"num\">416</td></table></body></html>");
    
        std::string to_find("<td class=\"num\">");
    
        std::string::size_type pos;
    
        if((pos = text.find(to_find)) != std::string::npos)
            std::cout << std::atoi(text.c_str() + pos + to_find.length()) << std::endl;
        else
            std::cout << "Not found" << std::endl; 
    return 0;
    }
    Вот весь код, какие нужны инклюды? Что вообще надо сделать чтобы работало?

    P.S. Там в коде некоторые функции самописные
     
  5. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Знаешь, забудь все, чему я учил, и пиши на чистом си, раз уж у тебя такой омг-код, каша из смеси сишника и с++. Ты же взял и просто скопировал код моего примера, т.е. вообще без мыслей и понимания. Переписывать такой треш, который ты показал, я не буду)
     
  6. Jest

    Jest New Member

    Joined:
    4 Oct 2010
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
    Так там всё и не надо, только инклюды и тот код который ты кинул...
    Вообще я C и С++ не сильно различаю... читал литературу по С++ там коды все выглядят также как и у меня!
     
  7. Jest

    Jest New Member

    Joined:
    4 Oct 2010
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
    Что за функция cut_str_to_char ?
     
  8. Jest

    Jest New Member

    Joined:
    4 Oct 2010
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
    А, извиняюсь, нашёл в гугле исходник от Руди! Буду пытаться сделать всё-таки что-нибудь...
     
  9. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Я привел вообще пример для конкретного html-кода, а ты и его сунул себе...
    Если бы ты писал на с++ с использованием классов stl, то не было бы такой жести с чтением файла page.html, который в твоем случае не длиннее 5000 байт может быть. Было бы примерно так:
    PHP:
    std::ifstream file;
    file.open("page.html"std::ifstream::in);

    if(!
    file)
    {
        
    std::cout << "Error opening file";
        return;
    }

    std::string buf;

    std::copy(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>(), std::back_inserter(buf));

    file.close();

    //Теперь в buf - все полностью, что лежало в файле page.html
    Надеюсь, ты видишь разницу.

    Вообще, советую взяться за более простой язык программирования, если в этом знаний нет.
     
  10. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    187
    Reputations:
    5
    Jest
    Я щас пьяный но скажу тебе что гг, не парся
    используй библиотку rudi.cpp
    для работы со строками и не будешь знать горя


    скачать Rudi.cpp

    и тогда код сработает

    PHP:
    char Buffer[]="<html><head><title>lol</title></head>\ 
    <body><table><td class=\"num\">416</td></table>\ 
    </body></html>"
    ;
    char met[]="<td class=\"num\">";
    char Answer[50];

    if(
    cut_str_to_char(Buffermet'<'Answer50))
    cout << Answer;
    else
    count << "Error";
    Коасткое описание в rudi.cpp внутри
     
    #5850 rudi, 27 Nov 2010
    Last edited: 27 Nov 2010
  11. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Небольшой вопрос - зачем было писать то, что уже написано и содержится в стандартной библиотеке c++?))

    А во-вторых, у него не скомпилится твоя библиотека

    PHP:
    void my_sleep_1000(int sec)
    {
        
    int x =0;
        while(
    sec)
          {
              
    Sleep(50);
              
    Application->ProcessMessages(); //Это что, из борланда? А если он использует VC++?
              
    +=50;
          }
    }
    Охчерт, а это же вообще убиться, инклюды внутри тела функции...
    PHP:
    void tolowerStr(char *Str)
    {
         
    #include <windows.h>
         #include <ctype.h>

         
    SetConsoleCP(1251);
         
    SetConsoleOutputCP(1251);
         
    setlocale(LC_CTYPE,"Russian");
         
         
    int len strlen(Str);
         for(
    int c=0c<lenc++)
           
    Str[c] = tolower(Str[c]);
    }
    Полистал я библиотеку твою... По-моему ты всегда пьяный, причем сильно...
     
    #5851 GRRRL Power, 27 Nov 2010
    Last edited: 27 Nov 2010
  12. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    187
    Reputations:
    5
    да да
    void my_sleep(float sec);
    void my_sleep_1000(int sec);
    Это убери в rudi.cpp
    сотри нафиг
    и тогда все запашет
     
  13. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    187
    Reputations:
    5
    Да я както более на Си просто пишу
    потому и написал себе эту хрень
     
  14. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    По-моему там не си и не си++, а хардкор вечнопьяного программиста. А уж в борланде вообще есть AnsiString, в VC++ можно использовать string, на крайний случай - скачать какой-нибудь boost и радоваться тому, что все за тебя уже написали.
    Если бы там был чистый си, то не было бы всяких объявлений переменных посередине функций, не было бы Application->ProcessMessages() и #include <iostream>...
     
    #5854 GRRRL Power, 27 Nov 2010
    Last edited: 27 Nov 2010
  15. Bers

    Bers Member

    Joined:
    17 May 2010
    Messages:
    78
    Likes Received:
    30
    Reputations:
    26
    Ты не прав насчет хрени. Это не хрень, это <censored> бред пьяного идиота.

    PHP:
    bool cut_to_str(char *sourcechar *Endchar *destsize_t MaxSize)
    {
           
    size_t len 0;
           
    char *pt strstr(source,End);
           if( !
    pt )  {dest[0] = 0; return false;};
           
    len pt - &source[0];
               if(
    len > (MaxSize-1)) {dest[0] = 0; return false;};
           
    strncpy(dest,source,len);
           
    dest[len] = 0;
           return 
    true;
    };

    void tolowerStr(char *Str)
    {
         
    #include <windows.h>
         #include <ctype.h>

         
    SetConsoleCP(1251);
         
    SetConsoleOutputCP(1251);
         
    setlocale(LC_CTYPE,"Russian");
         
         
    int len strlen(Str);
         for(
    int c=0c<lenc++)
           
    Str[c] = tolower(Str[c]);
    }


    Никогда не пиши больше код. Читай книжки. Веди трезвый образ жизни. Никогда не показывай людям ТАКОЙ код.

    Да меня блин вырвало, когда я ЭТО скачал и посмотрел! Серьезно, писать такой бред... Функция tolowerStr() - просто шедевр, я распечатаю и повешу себе на стенку.
     
  16. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    187
    Reputations:
    5
    GRRRL Power
    Я не особо знаю стандартные функции С++
    Но мне будет интересно у тебя узнать
    как можно например справиться с такой задачей
    есть следующее:
    char Str[]="hello my dear friend Max, How are you?";
    char Name[128];

    Нужно считать из строки Str в буффер Name Имя Max
    как это сделать?


    _______
    Bers
    Я выложил тут работу со строками а не ToLower
    ToLowerStr - тут лишнее, сугубо личное использование
    перевод русских символов в нижний регистр
     
    #5856 rudi, 27 Nov 2010
    Last edited: 27 Nov 2010
  17. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Если принять, что имя расположено между "friend " и запятой, то так:

    PHP:
    #include <string>
    #include <iostream>

    void main()
    {
        const 
    std::string str("hello my dear friend Max, How are you?");
        
    std::string to_find("friend ");

        
    std::string::size_type pospos2;

        if((
    pos str.find(to_find)) != std::string::npos &&
            (
    pos2 str.find(','pos)) != std::string::npos)
        {
            
    pos += to_find.length();
            
    std::string name(str.substr(pospos2 pos));
            
    std::cout << name << std::endl;
        }
    }
    Заметь, никаких просчетов длин буферов, поиска конца строк по нулевому байту и подобного си. И имя, и строка могут быть любой длины.
     
  18. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    187
    Reputations:
    5
    GRRRL Power
    Интересный конечно код.
    В моем Cpp так можно было бы сделать
    cut_str_to_char(Str, "friend ", ',', Name, 128);

    намного короче и понятнее
     
  19. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    О да, я знал, что ты это напишешь. Но что мешает обернуть мой код в аналогичную функцию? Отличие будет в том, что не нужно будить париться с длинами буферов и делать унылые циклы.
     
  20. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    187
    Reputations:
    5
    согласен, если обернуть твой код , то тоже будет коротко и понятно
    Отличие лишь в том что память будет выдяляться динамически,
    которую и освобождать потом кстате нужно каждый раз
    а если например, мне нужно выделять память для ответа не более 10 байт?
    И если ответ более 10 байт то считать ответ ошибочным.

    Потому предпочитаю передавать уже выделенный заранее участок памяти

    Ведь например мы получили страницу HTML
    и нам нужно выдернуть отттуда например Имя юзера
    мы знаем что имя его между тегами <h1 class="Name"> Юра<\h1>
    Сегодня наша программа работает коректно, выдергивает имя Юра и выделяет память для него
    А завтра на сайте произошли изменеия, и имя Юра в других тегах теперь.
    Твой парсер например начнет глючить, пытаясь выдернуть имя из старых тегов
    а старых тегов уже нету, парсер будет искать другие похожие теги
    и если найдет удовлетворяющие условия выдернит типа имя на несколько килобайт длинною, в которых будет не имя а кусок кода страницы, просто попашего в твои условия
    выделив для этого память.
    А если указать максимальную длину ответа, то такого не произойдет....


    Спорить можно долго, согласен что с выделением динамической памяти есть и свои плюсы
    но думаю не в этом случае
     
    #5860 rudi, 27 Nov 2010
    Last edited: 27 Nov 2010
Thread Status:
Not open for further replies.