C++ ncurses question

Discussion in 'Mac Programming' started by toothyXdip, Apr 16, 2009.

  1. macrumors newbie

    Joined:
    Aug 27, 2008
    #1
    Ok I would have no problem doing this using cout <<, and cin >>, but I am having trouble doing it with ncurses.

    Code:
    #include <ncurses.h>
    #include <string.h>
    #include <iostream>
    
    int row, col;
    char mesg[] = "Whats your name?\n";
    char name[50];
    
    void userinput()
    {	
    	initscr();
    	printw("Hey! I know you.");
    	refresh();
    	getch();
    	endwin();
    }
    
    int main()
    {	
    	initscr();
    	getmaxyx(stdscr,row,col);
    	mvprintw(1, (col-strlen(mesg))/2, mesg);	
    	getstr(name);
    	if (name == "Bob")
    	{
    		userinput();
    	}
    	refresh();		
    	getch();				
    	endwin();
    	
    	return 0;
    }
    
    It compiles but when I type in the name "Bob" nothing happens. I have a feeling that its not even considering the if statement because it reacts as if it wasn't even there.

    Also, when I try to make name a string variable I get the errors:
    Code:
    cpp:7: error: ‘string’ does not name a type
    cpp: In function ‘int main()’:
    cpp:23: error: ‘name’ was not declared in this scope
    
    
     
  2. Moderator emeritus

    kainjow

    Joined:
    Jun 15, 2000
    #2
    == here is comparing the pointer values. Use strcmp() which returns 0 if the two strings are equal.
     
  3. macrumors 6502

    Joined:
    Jul 25, 2006
    #3
    Also, the string class isn't in the top-level namespace. To switch to using C++ strings, you need to either use "std::string" or "using namespace std;"

    Of course, you can't pass a std::string to getstr(). You'd need to pass a buffer (like you do now), then create a std::string with the buffer. If you do that, then you can use ==.

    Also, watch out for buffer overflows ;-)
     
  4. thread starter macrumors newbie

    Joined:
    Aug 27, 2008
    #4
    Sorry for this but I just started learning c++ yesterday so I am just going on online tuts. I'm probably going to order a book so I might put a thread up for recommendations.

    I have no problem with someone just pointing me in the direction of a website/online tutorial that will explain the problems I'm having. I did google both errors and things involved but didn't find much. These are most likely very simple problems to solve, so again sorry.

    @kainjow
    When I change the if statement to:
    Code:
    	if (strcmp(name, "Bob") = 0)
    	{
    		userinput();
    	}
    
    I get the error:
    Code:
    invalid lvalue in assignment
    
    and im guessing its because name isn't a string, but I cant make it a string without using a buffer? And if you continue to read you will see I really have no clue on how to use a buffer.

    @kpua
    I didn't really know what a buffer was, so I Googled it. What I learned was a buffer is a resource which can hold a number of tokens. And even after looking at examples and looking up more one them, I still wasnt sure how to use them with my problem. I don't want to be spoon fed this, so if you could tell me where to start, or ways buffers are used, or link/write an example using buffers I would be very appreciative.

    Thanks
     
  5. macrumors 6502

    Joined:
    Jul 25, 2006
    #5
    Use ==, not = in your if statement.

    The term "buffer" in practice essentially means an array (usually statically allocated). We usually call an array a "buffer" when it's the destination of some data we're receiving. (In this example, we're receiving data from getstr())

    The code you posted original had a buffer called "name". If the buffer contains a sequence of characters followed by a null terminator, it can also be called a "C string".

    So, when searching tutorials/documentation, understand that "buffers" and "C strings" are often interchangeable.

    A task for you (since you don't want to be spoon fed): Find out how to create a C++ string from a C string (or in other words, the 'name' array in your code).
     

Share This Page