Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

C gets function

  1. May 27, 2005 #1
    Im trying to learn some c after java.

    Im writing a linked list and i have this problem

    from main i call : add( (x *)&head, (x *)&tail)

    inside the function add i try to get input from user

    blah balh
    strcpy(tail->name, gets(str));

    why does the program goes to next line without letting me to input the name ?

    i hope im clear if not let me know

  2. jcsd
  3. May 27, 2005 #2
    probably there is still a newline in the buffer, to find out you can do this:

    blah balh
    printf("ABC %s DEF", gets());
    strcpy(tail->name, gets(str));

    if ABC and DEF get printed on different lines you know for sure
  4. May 27, 2005 #3
    *agrees with gerben*
    This has happened with me one times too many.
    If you are sure that at no point in your program, a new line is making its way in, then try using fflush(stdin) . Ofcourse for some reasons, this is not guaranteed to work.

    -- AI
  5. May 27, 2005 #4


    User Avatar
    Staff Emeritus

    Just a note: Whenever doing strcpy operations make sure to check bounds. This is how you create buffer overflow problems.
  6. May 27, 2005 #5
    thanx a lot

    one more seemly unrelated question.

    char *str="blabh";
    Why tail->name=str //does not work ?

    why do i have to use the strcpy ?
  7. May 27, 2005 #6
    tail->name and str are both pointers (char *).
    tail->name = str;
    means assign the adress that str points to to the pointer variable tail->name, so that that pointer variable points to the same adress. So you will get a problem when the memory that str points to gets freed.

    Probably both pointers (str and tail->name) already have some declared memory to which they point and you just want to copy the content of the memory to which str points to the memory that tail->name points to.
    You could do this:
    *(tail->name) = *str;
    but that will only copy the first character of the string, so you should use strcpy()
  8. May 27, 2005 #7
    Of course you should also never use gets for the same reason.
  9. Jun 10, 2005 #8
    first of all str should be declare:
    char str[] = "blabh"
    to ensure the compiler generate the correct code to allocate memory for the array and not just a char pointer.

    tail->name = str;
    tail->name and str point to the same data in memory, if str is a local variable then that memory is gone when the function exit and tail->name is no longer valid. that is why you need you need to copy the data into tail->name location. Another danger of tail->name = str is that now you just lost the memory location of where tail->name was pointed to earlier, and the memory location allocate for tail->name is now loss. You just have cause a memory leak.
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook