Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much

Inline::C not behaving as expected

by Ovid (Cardinal)
on Dec 24, 2001 at 10:42 UTC ( #134144=perlquestion: print w/replies, xml ) Need Help??

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?


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.)

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://134144]
Approved by root
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (5)
As of 2021-08-05 20:36 GMT
Find Nodes?
    Voting Booth?
    My primary motivation for participating at PerlMonks is: (Choices in context)

    Results (44 votes). Check out past polls.