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

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?

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

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://134144]
Approved by root
help
Chatterbox?
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
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My primary motivation for participating at PerlMonks is: (Choices in context)








    Results (44 votes). Check out past polls.

    Notices?