http://www.perlmonks.org?node_id=134144

Ovid has asked for the wisdom of the Perl Monks concerning the following question:

I'm playing around with Inline and I'm not getting the results that I expect. This snippet attempts to extract the date from a string and return it, but it's appending an 'x' to the end of the string. Any ideas why?

#!/usr/bin/perl -w use strict; use Inline C =><<'END_OF_C_CODE'; #include <string.h> void get_date( char* str ) { /* much thanks to wog and talexb for suggestions */ char date[9]; /* the date to return */ int index = 0; /* index of character in string */ Inline_Stack_Vars; Inline_Stack_Reset; while ( str[index++] != '|' ); strncpy( date, &str[index], 8); Inline_Stack_Push(newSVpvf(date)); Inline_Stack_Done; } END_OF_C_CODE print get_date("adb|20011225|asdf");

This prints "20011225x". Any ideas why?

Cheers,
Ovid

Join the Perlmonks Setiathome Group or just click on the the link and check out our stats.

Replies are listed 'Best First'.
Re: Inline::C not behaving as expected
by wog (Curate) on Dec 24, 2001 at 10:50 UTC

    Though you are using strncpy(), your string is not null-terminated. (update: to quote from the docs for strncpy on my machine "if there is no null byte among the first n bytes of src, the result will not be null-terminated.") To fix this probably you can do one of the following:

    • Add a date[8] = '\0'; line.
    • Use newSVpvn(date,8) to create a string of a specific length.

    I would note that your current use of newSVpvf() should be replaced with newSVpv(date,0) or similar, to prevent odd behavior and/or major security flaws from popping up if your data contains %s. (Or, at least, to prevent you from getting in to the habit of coding that way for when it would matter.)