Solved

How to parse irc command??? using c

Posted on 2004-10-29
358 Views
Last Modified: 2008-03-17
I am looking for help on how to parse irc commands using c:Any have any simple code I can look at or a link etc that can point me into the right direction on how I can do this with using c would be great. I am able to parse it some but I am having a few problems with it.Thank you and any help on this subject would be great.Thank you.
0
Question by:bbkk
    19 Comments
     
    LVL 2

    Expert Comment

    by:Sadrul
    0
     
    LVL 5

    Expert Comment

    by:van_dy
    one of the ways is to look into the RFC, other is to see
    the source  code already availiable, like epic etc.
    0
     

    Author Comment

    by:bbkk
    Here is what I got......Or trying..

    void ParseMessage(HWND hwnd,char *mes) {

     char *strtotok;
      strtotok = strtok(mes,"\r\n");
      char *finddot,*findsdot,*dot1,*dot2;
         
      if(strtotok != NULL) {
         if(strncmp(strtotok,":",1) == 0) {
          finddot = strstr(strtotok,":")+1;
          findsdot = strstr(finddot,":")+1;
       
          SendMessage(chatrichedit,  EM_REPLACESEL, 0, (LPARAM)findsdot);
          SendMessage(chatrichedit,  EM_REPLACESEL, 0, (LPARAM)"\r\n");
     
      }
      else {
            SendMessage(chatrichedit,  EM_REPLACESEL, 0, (LPARAM)strtotok);
          SendMessage(chatrichedit,  EM_REPLACESEL, 0, (LPARAM)"\r\n");
     
      }
      }
    while(strtotok) {
     strtotok = strtok(NULL,"\r\n");
     
     if(strtotok != NULL) {
     if(strncmp(strtotok,":",1) == 0) {
      dot1 = strstr(strtotok,":")+1;
     
     dot2 = strstr(dot1,":");
      if( dot2 != NULL) {

          SendMessage(chatrichedit,  EM_REPLACESEL, 0, (LPARAM)dot2);
          SendMessage(chatrichedit,  EM_REPLACESEL, 0, (LPARAM)"\r\n");
       
       }
       else {
            SendMessage(chatrichedit,  EM_REPLACESEL, 0, (LPARAM)strtotok);
          SendMessage(chatrichedit,  EM_REPLACESEL, 0, (LPARAM)"\r\n");
     
      }
        }
     
     }
    }

     }


    problem
    Connected
    *** Looking up your hostname...
    *** Checking ident...
    :*** Checking for open socks server...
    *** Found your hostname
    NOTICE Bk :*** If you are having problems connecting due to ping timeouts, please type /notice 81051CF7 nospoof now.
    Welcome to the ROXnet IRC Network Bk!~bk@localhost
    :Your host is localhost, running version UnrealIRCd/32 v3.0-Morrigan(fix)
    :This server was created Sun Feb 27 2000 at 11:55:29 GMT
    :localhost 004 Bk localhost UnrealIRCd/32 v3.0-Morrigan(fix) oOiwghskSaHANTcCfrxebWqBFIZ1dvt lvhopsmntikrRcaqOALQbSeKVfH
    :are available on this server
    :There are 0 users and 0 invisible on 1 servers
    :unknown connection(s)
    :I have 0 clients and 0 servers
    :Current Local Users: 0  Max: 2
    :Current Global Users: 0  Max: 1
    :- localhost Message of the Day -
    :- 29/10/2004 17:55
    :- ****Welcome to test IRC****
    :- Hello and welcome I hope you enjoy your stay    
    :- If you need andy help just let me know at          
    :localhost                                                           <--prob is there   what is making it
     372 Bk :- www.here.com                                   <--prob is there    come out like this??
    :-
    :-
    :-
    :-  
    :End of /MOTD command.
    :+x

    Thank you
    0
     

    Author Comment

    by:bbkk
    I have fixed this problem by increasing my recv buffer...... but the rfc says you need just a buffer of  512bytes.For what I can tell the reason why I am getting this problem here

    :- Hello and welcome I hope you enjoy your stay    
    :- If you need andy help just let me know at          
    :localhost                                                           <--prob is there   what is making it
     372 Bk :- www.here.com                                   <--prob is there    come out like this??
    :-
     is cause that is the end of the 512 bytes and a new 512 bytes is coming into play


    Any help on this would be greatly appreciated.
    0
     
    LVL 2

    Expert Comment

    by:Sadrul
    these 512-byte chunks are followed by \r\n i presume? in which case you'll have to get rid of them before appending the rest of the messages.

    -- Adil
    0
     

    Author Comment

    by:bbkk
    How would I go about doing that??? Thank you
    0
     

    Author Comment

    by:bbkk
    I have figured how to replace the \r\n but this way of parsing the message stil has bugs in it.WOuld like to know of a better way.
    0
     
    LVL 2

    Expert Comment

    by:Sadrul
    one way of doing it would be to check for the last bytes. if they are \r\n, simple replace them with \0. for example:

    if(buffer[510] == '\r' && buffer[511] == '\n')
        buffer[510] = 0;

    what bugs exactly are you having?

    -- Adil
    0
     

    Author Comment

    by:bbkk
    With the code I have up top I am striping away the \r\n by using strtok().I am adding the \r\n back to the line with  SendMessage(chatrichedit,  EM_REPLACESEL, 0, (LPARAM)"\r\n");
    With this code below

    void ParseMessage(HWND hwnd,char *mes) {

     char *strtotok;
      strtotok = strtok(mes,"\r\n");
      char *finddot,*findsdot,*dot1,*dot2;
         
      if(strtotok != NULL) {
         if(strncmp(strtotok,":",1) == 0) {
          finddot = strstr(strtotok,":")+1;
          findsdot = strstr(finddot,":")+1;
       
         SendMessage(chatrichedit,  EM_REPLACESEL, 0, (LPARAM)findsdot);
         SendMessage(chatrichedit,  EM_REPLACESEL, 0, (LPARAM)"\r\n");
         
      }
      else {
           int nLength = GetWindowTextLength(chatrichedit) ;
                SendMessage(chatrichedit, EM_SETSEL, nLength-1, nLength);
           SendMessage(chatrichedit,  EM_REPLACESEL, 0, (LPARAM)strtotok);
         SendMessage(chatrichedit,  EM_REPLACESEL, 0, (LPARAM)"\r\n");
     
      }
      }
    while(strtotok) {
     strtotok = strtok(NULL,"\r\n");
     
     if(strtotok != NULL) {
     if(strncmp(strtotok,":",1) == 0) {
      dot1 = strstr(strtotok,":")+1;
     
     dot2 = strstr(dot1,":")+1;
      if( dot2 != NULL) {

         SendMessage(chatrichedit,  EM_REPLACESEL, 0, (LPARAM)dot2);
         SendMessage(chatrichedit,  EM_REPLACESEL, 0, (LPARAM)"\r\n");
       
       }
       else {
           SendMessage(chatrichedit,  EM_REPLACESEL, 0, (LPARAM)strtotok);
         SendMessage(chatrichedit,  EM_REPLACESEL, 0, (LPARAM)"\r\n");
     
      }
        }
     
     }
    }

     }



    I get this
    Connected
    *** Looking up your hostname...
    *** Found your hostname (cached)
    *** Checking ident...
    *** Checking for open socks server...
    NOTICE Bk :*** If you are having problems connecting due to ping timeouts, please  
    ^^^^^^^
    problem up above should be
    *** If you are having problems connecting due to ping timeouts, please
    type /notice EA73A891 nospoof now.
    Welcome to the ROXnet IRC Network Bk!~bk@localhost
    Your host is localhost, running version UnrealIRCd/32 v3.0-Morrigan(fix)
    This server was created Sun Feb 27 2000 at 11:55:29 GMT
                                                                            <-------problem should not be a space
    are available on this server
    There are 0 users and 0 invisible on 1 ser
    vers
    unknown connection(s)
    I have 0 clients and 0 servers
    Current Local Users: 0  Max: 2
    Current Global Users: 0  Max: 1
    - localhost Message of the Day -
    - 30/10/2004 23:25
    -                
    -  Test.com
    -   ----------------------------------------------------------
    -   Staff
    -      joe    jhon        jim          jeff                    
    -      jonny   sue        gary        billy      
    -      
    -                                            
    -   Offical Channels:-
    -      #Test - Network Representative Channel
    -      #TestHelp   - Network help desk
    -      #TestStaff - Network staff
    -     ----------------------------------------------------------

    lhost 372 Bk :-                                       <---this is a problem
    -      Random Server   - irc.test.com
    -                                    irc.test.net
    -      
    -      Report abuse by email to admins@test.com
    -   ----------------------------------------------------------
    End of /MOTD command.
    +xPING :localhostPING :localhostPING :localhost     <--- problem pings should be like below
                                                                                          +x
                                                                                          PING :localhost
                                                                                          PING :localhost
                                                                                          PING :localhost



    This is with using the code up above.


    This is what it looks like that I am parsing
    Connected
    :localhost NOTICE AUTH :*** Looking up your hostname...
    :localhost NOTICE AUTH :*** Checking ident...
    :localhost NOTICE AUTH :*** Checking for open socks server...
    :localhost NOTICE AUTH :*** Found your hostname
    NOTICE Bk :*** If you are having problems connecting due to ping timeouts, please type /notice F8B369B9 nospoof now.
    PING :F8B369B9
    :localhost 001 Bk :Welcome to the ROXnet IRC Network Bk!~bk@localhost
    :localhost 002 Bk :Your host is localhost, running version UnrealIRCd/32 v3.0-Morrigan(fix)
    :localhost 003 Bk :This server was created Sun Feb 27 2000 at 11:55:29 GMT
    :localhost 004 Bk localhost UnrealIRCd/32 v3.0-Morrigan(fix) oOiwghskSaHANTcCfrxebWqBFIZ1dvt lvhopsmntikrRcaqOALQbSeKVfH
    :localhost 005 Bk TOKEN WATCH=128 SAFELIST HCN PREFIX=@+% :are available on this server
    :localhost 251 Bk :There are 0 users and 0 invisible on 1 servers
    :localhost 253 Bk 1 :unknown connection(s)
    :localhost 255 Bk :I have 0 clients and 0 servers
    :localhost 265 Bk :Current Local Users: 0  Max: 2
    :localhost 266 Bk :Current Global Users: 0  Max: 1
    :localhost 375 Bk :- localhost Message of the Day -
    :localhost 372 Bk :- 30/10/2004 23:25
    :localhost 372 Bk :-                
    :localhost 372 Bk :-  Test.com
    :localhost 372 Bk :-   ----------------------------------------------------------
    :localhost 372 Bk :-   Staff
    :localhost 372 Bk :-      joe      jhon        jim          jeff
    :localhost 372 Bk :-      jonny   sue        gary        billy      
    :localhost 372 Bk :-      
    :localhost 372 Bk :-                                            
    :localhost 372 Bk :-   Offical Channels:-
    :localhost 372 Bk :-      #Test - Network Representative Channel
    :localhost 372 Bk :-      #TestHelp   - Network help desk
    :localhost 372 Bk :-      #TestStaff - Network staff
    :localhost 372 Bk :-     ----------------------------------------------------------
    :localhost 372 Bk :-
    :localhost 372 Bk :-      Random Server   - irc.test.com
    :localhost 372 Bk :-                                    irc.test.net
    :localhost 372 Bk :-      
    :localhost 372 Bk :-      Report abuse by email to admins@test.com
    :localhost 372 Bk :-   ----------------------------------------------------------
    :localhost 376 Bk :End of /MOTD command.
    :Bk MODE Bk :+x
     

    Thank you for your help
    0
     
    LVL 2

    Expert Comment

    by:Sadrul
    first of all,

        if(strncmp(strtotok,":",1) == 0)
        {
            finddot = strstr(strtotok) + 1;

    this can be easily rewritten as:

        if(strtotok[0] == ':')
        {
            finddot = strtotok + 1;

    however, from what you are doing, i think the whole function can be rewritten as:


    void ParseMessage(HWND hwnd,char *mes)
    {
        char *str = strrchr(mes, ':'); /* find the last occurance of  :  in the message */

        if(*str)
        {
            str++;
            if(*str)
            {
                /* now you have the extracted message in str.
                 * add it in the editbox
                 */
            }
        }
    }


    if function `strrchr' (notice that it is NOT `strchr') is not present in VC library, then define it as following:


    char *strrchr(const char *s, char c)
    {
        char *ret = 0;
       
        while(*s)
        {
            if(*s == c)
                ret = s;
            s++;
        }
        return ret;
    }


    -- Adil
    0
     
    LVL 2

    Expert Comment

    by:Sadrul
    a little correction:

    str = strrchr(msg, ':');

    if(str) // NOT *str
    {
    ...



    -- Adil
    0
     

    Author Comment

    by:bbkk
    Hello Sadrul,
         Your code produces this.....

    Connected
    *** Looking up your hostname...

    *** Checking for open socks server...

    48CBB155

    There are 0 users and 0 invisible on 1 ser
    -      joe  
    loca
    +x


    The problem is that one string can have this...
    :localhost 372 Bk :-   Offical Channels:-
    :localhost 372 Bk :-      #Test - Network Representative Channel
    :localhost 372 Bk :-      #TestHelp   - Network help desk
    :localhost 372 Bk :-      #TestStaff - Network staff
    :localhost 372 Bk :-     ----------------------------------------------------------
    :localhost 372 Bk :-
    :localhost 372 Bk :-      Random Ser  

    Then another string can come in and have the other half of the string above

    ver   - irc.test.com
    :localhost 372 Bk :-                                    irc.test.net
    :localhost 372 Bk :-      
    :localhost 372 Bk :-      Report abuse by email to admins@test.com
    :localhost 372 Bk :-   ----------------------------------------------------------
    :localhost 376 Bk :End of /MOTD command.
    :Bk MODE Bk :+x


    I have to take these strings and parse out all the
    :localhost 372 Bk :-                                  
    :localhost 372 Bk :-      
    :localhost 372 Bk :-

    etc and at the end of those string I have to take away the \r\n


    If I can figure this out I will be sure give more points.Thanks you Sadrul




    0
     

    Author Comment

    by:bbkk
    Also this is how the format shouild look.

    *** Looking up your hostname...
    *** Found your hostname (cached)
    *** Checking ident...
    *** Checking for open socks server...
    *** Received identd response
    *** If you are having problems connecting due to ping timeouts, please type /notice 4DA5D853 nospoof now.
    Welcome to the ROXnet IRC Network forgiven!forgiven@localhost
    Your host is localhost, running version UnrealIRCd/32 v3.0-Morrigan(fix)
    This server was created Sun Feb 27 2000 at 11:55:29 GMT
    localhost UnrealIRCd/32 v3.0-Morrigan(fix) oOiwghskSaHANTcCfrxebWqBFIZ1dvt lvhopsmntikrRcaqOALQbSeKVfH
    TOKEN WATCH=128 SAFELIST HCN PREFIX=@+% :are available on this server
    There are 1 users and 0 invisible on 1 servers
    1 :unknown connection(s)
    I have 1 clients and 0 servers
    Current Local Users: 1  Max: 2
    Current Global Users: 1  Max: 1
    - localhost Message of the Day -
    - 30/10/2004 23:25
    -                
    -  Test.com
     -   ----------------------------------------------------------
    -   Staff
    -      joe      jhon        jim          jeff
    -      jonny   sue        gary        billy      
    -      
    -                                            
    -   Offical Channels:-
    -      #Test - Network Representative Channel
    -      #TestHelp   - Network help desk
    -      #TestStaff - Network staff
    -     ----------------------------------------------------------
    -
    -      Random Server   - irc.test.com
    -                                    irc.test.net
    -      
    -      Report abuse by email to admins@test.com
    -   ----------------------------------------------------------




    Thanks
    0
     
    LVL 2

    Expert Comment

    by:Sadrul
    a successful implementation depends also on how you are receiving the messages from the server. when exactly are you calling ParseMessage? and what is hwnd?

    the problem here is that every message ends with CRLF. so does every command. so if a message contains a (or more) complete commands, then it will end with CRLFCRLF, right? that's what i am checking here. if it doesn't, then there is at least one incomplete command. so we parse everything except the incomplete one. the next time we get another message, we append the previous incomplete command at the beginning of the new message, and start parsing.

    anyways, here's something i have put together. consider it as pseudo-code, since i have not tested it. i have tried to add some comments, which will hopefully make it clear:

    --------------------------------------------------------------------------------
    #define BUFFER_SIZE 2048

    /* this is the buffer to store incomplete commands/messages */
    char buffer[BUFFER_SIZE];

    /* this will be parsed */
    char parse[BUFFER_SIZE];

    /*
     * i am assuming that mes is always 512-bytes ending with CRLF
     */
    void ParseMessage(HWND hwnd,char *mes)
    {
        char *cmd;

        mes[510] = 0;   /* getting rid of the ending CRLF that is auto-appended*/
       
        /* if any incomplete command is left from previous message,
         * then copy it into the string to be parsed
         */
        strncpy(parse, buffer, BUFFER_SIZE);

        if(mes[508] == '\r' && mes[509] == '\n')
        {
            /* mes contains a complete command
             * nothing needs to be done.
             * buffer should be empty
             */
            buffer[0] = 0;
        }
        else
        {
            /* mes contains an incomplete command,
             * because every command ends with CRLF.
             * so, save the incomplete command in buffer
             * and make the incomplete command invisible
             */
            char *inc = strrchr(mes, '\n');
            if(inc)
            {
                inc++;      /* start of the incomplete command */
                strncpy(buffer, inc, BUFFER_SIZE);/* save the incomplete command */
                *inc = 0;   /* make the incomplete command invisible now */
            }
        }

        /* add the new message in the parse-string */
        strncat(parse, mes, BUFFER_SIZE);

        cmd = strtok(parse, "\r\n");

        while(cmd)
        {
            char *str = strrchr(mes, ':'); /* last occurance of : in the message */

            if(str)
            {
                str++;
                if(*str)
                {
                    /* now you have the extracted message in str.
                     * add it in the editbox
                     */
                }
            }

            cmd = strtok(NULL, "\r\n");
        }
    }
    --------------------------------------------------------------------------------

    -- Adil
    0
     
    LVL 2

    Expert Comment

    by:Sadrul
    correction again:

           char *str = strrchr(cmd, ':'); /* should be cmd, not mes */

    OR, the whole loop could look like:

        while(cmd)
        {
            char str[BUFFER_SIZE], dummy[BUFFER_SIZE];
            char *prnt;
            /* since the message always seems to have similar initial words */
            sscanf(cmd, ":%s %s %s %[^\0]", dummy, dummy, dummy, str);
            if(str[0] == ':')
                prnt = str + 1;
            else
                prnt = str;
            if(*prnt)
            {
                /* now you have the extracted message in prnt.
                 * add it in the editbox
                 */
            }

            cmd = strtok(NULL, "\r\n");
        }

    -- Adil
    0
     

    Author Comment

    by:bbkk
    Hello there Sadrul,

    this code here is close.


    //////////////Server connection
    #define BUFFER_SIZE 2048


    /* this is the buffer to store incomplete commands/messages */
    char buffer[BUFFER_SIZE];

    /* this will be parsed */
    char parse[BUFFER_SIZE];

    /*
     * i am assuming that mes is always 512-bytes ending with CRLF
     */


    void ParseMessage(HWND hwnd,char *mes)
    {
        char *cmd;

        mes[510] = 0;   /* getting rid of the ending CRLF that is auto-appended*/
       
        /* if any incomplete command is left from previous message,
         * then copy it into the string to be parsed
         */
        strncpy(parse, buffer, BUFFER_SIZE);

        if(mes[508] == '\r' && mes[509] == '\n')
        {
            /* mes contains a complete command
             * nothing needs to be done.
             * buffer should be empty
             */
            buffer[0] = 0;
        }
        else
        {
            /* mes contains an incomplete command,
             * because every command ends with CRLF.
             * so, save the incomplete command in buffer
             * and make the incomplete command invisible
             */
            char *inc = strrchr(mes, '\n');
            if(inc)
            {
                inc++;      /* start of the incomplete command */
                strncpy(buffer, inc, BUFFER_SIZE);/* save the incomplete command */
                *inc = 0;   /* make the incomplete command invisible now */
            }
        }

        /* add the new message in the parse-string */
        strncat(parse, mes, BUFFER_SIZE);

        cmd = strtok(parse, "\r\n");

          while(cmd)
        {
            char str[BUFFER_SIZE], dummy[BUFFER_SIZE];
            char *prnt;
            /* since the message always seems to have similar initial words */
            sscanf(cmd, ":%s %s %s %[^\0]", dummy, dummy, dummy, str);
            if(str[0] == ':')
                prnt = str + 1;
            else
                prnt = str;
            if(prnt)
            {
                 SendMessage(chatrichedit,  EM_REPLACESEL, 0, (LPARAM)str);
                 SendMessage(chatrichedit,  EM_REPLACESEL, 0, (LPARAM)"\r\n");
            }

            cmd = strtok(NULL, "\r\n");
        }
    }

    THe code produces this...

    "Note, I added the bad spots with <--- etc in the formated message"

    Connected
    :*** Looking up your hostname...
    :*** Found your hostname (cached)
    :*** Checking ident...
    :*** Checking for open socks server...
    :*** Checking for open socks server...
    :*** Checking for open socks server...
    :Welcome to the ROXnet IRC Network Bk!~bk@localhost
    :Your host is localhost, running version UnrealIRCd/32 v3.0-Morrigan(fix)
    :This server was created Sun Feb 27 2000 at 11:55:29 GMT
    localhost UnrealIRCd/32 v3.0-Morrigan(fix) oOiwghskSaHANTcCfrxebWqBFIZ1dvt lvhopsmntikrRcaqOALQbSeKVfH
    TOKEN WATCH=128 SAFELIST HCN PREFIX=@+% :are available on this server
    :There are 0 users and 0 invisible on 1 svers <-- problem should be servers not svers
    1 :unknown connection(s)
    :I have 0 clients and 0 servers
    :Current Local Users: 0  Max: 2
    :Current Global Users: 0  Max: 2
    :- localhost Message of the Day -
    :- 30/10/2004 23:25
    :-                
    :-  Test.com
    :-   ----------------------------------------------------------
    :-   Staff
    :-      joe    jhon        jim          jeff
    :-      jonny   sue        gary        billy      
    :-      
    :-                                            
    :-   Offical Channels:-
    :-      #Test - Network Representative Channel
    :-      #TestHelp   - Network help desk
    :-      #TestStaff - Network staff
    :-     ----------------------------------------------------------
    :-
    :-      Random Server   - irc.test.com
    :-                                    irc.test.net
    :-      
    :-      Report abuse by email to admins@test.com
    :-   ----------------------------------------------------------
    :End of /MOTD command.
    :+x   <--- this one is ok cause its suppose to be there
    :+x    <--Whne a PING Command comes in it produces the user mode etc --> :+x -->
    :+x     <-- when it should be PING:LOCALHOST or just LocalHost -->
    :+x


     Thank you Sadrul for your time.

    GOing to go play with the could to see if I can do something with it.

     
    0
     

    Author Comment

    by:bbkk
    Ok I got this problem solved

    :There are 0 users and 0 invisible on 1 svers <-- problem should be servers not svers


    just have to solve this real quick and it looks like it will be good to go.
    :+x   <--- this one is ok cause its suppose to be there
    :+x    <--Whne a PING Command comes in it produces the user mode etc --> :+x -->
    :+x     <-- when it should be PING:LOCALHOST or just LocalHost -->
    :+x

    going back to pay with the code alittle more.
    0
     
    LVL 2

    Accepted Solution

    by:
    what does the PING commands that come in look like?

    i hope you realize that in the code above, the actual commands are all ignored (we are getting rid of them using `dummy'). so a good option would be to read the command in a variable, see what the command is, and take appropriate action.

    -- Adil
    0
     

    Author Comment

    by:bbkk
    Yeah I agree with ya about , "a good option would be to read the command in a variable, see what the command is, and take appropriate action.", this is what I am doing and everythihng seems to be working and going smoothly.

    I have another account but could not get into it cause I for got my user name etc so I created this one but I finally found the paper that had my user name and password so I  am going to give you these points and close this account and give yousome of my points from my other account.Just look in the c forum where its going to say points for  Sadrul :).Just go in there an say hi or bye or what ever so I can give you the points.Good day and thank you for your time and help.
    0

    Write Comment

    Please enter a first name

    Please enter a last name

    We will never share this with anyone.

    Featured Post

    6 Surprising Benefits of Threat Intelligence

    All sorts of threat intelligence is available on the web. Intelligence you can learn from, and use to anticipate and prepare for future attacks.

    Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small…
    This is a short and sweet, but (hopefully) to the point article. There seems to be some fundamental misunderstanding about the function prototype for the "main" function in C and C++, more specifically what type this function should return. I see so…
    The goal of this video is to provide viewers with basic examples to understand opening and writing to files in the C programming language.
    The goal of this video is to provide viewers with basic examples to understand recursion in the C programming language.

    846 members asked questions and received personalized solutions in the past 7 days.

    Join the community of 500,000 technology professionals and ask your questions.

    Join & Ask a Question

    Need Help in Real-Time?

    Connect with top rated Experts

    9 Experts available now in Live!

    Get 1:1 Help Now