Re: equivalent of chomp in perl
- From: Jordan Abel <random@xxxxxxxxxxxxx>
- Date: 4 Nov 2006 04:56:49 GMT
2006-11-03 <lnslh0kvgb.fsf@xxxxxxxxxxxxxxx>,
Keith Thompson wrote:
Jordan Abel <random@xxxxxxxxxxxxx> writes:
[...]
Anyway, in answer to the question
void
chomp(char *x) {
char *p = strrchr(x,'\n');
if(p) *p = 0;
}
Not quite.
Let's look at the definition from the Camel Book (the canonical book
on Perl, comparable to K&R). This is arguably a little off-topic, but
it's a good example of the pitfalls of emulating features of one
language in another language.
chomp VARIABLE
chomp LIST
chomp
This function (normally) deletes a trailing newline from the end
of a string contained in a variable. This is a slightly safer
version of chop (described next) in that it has no effect upon a
string that doesn't end in a newline. More specifically, it
deletes the terminating string corresponding to the current value
of $/, and not just any last character.
Unlike chop, chomp returns the number of characters deleted. If $/
is "" (in paragraph mode), chomp removes all trailing newlines
from the selected string (or strings, if chomping a LIST). You
cannot chomp a literal, only a variable.
Some of the features of chomp aren't applicable to a C version: it can
be applied to either a list or a single variable, and the argument
defaults to $_ (if you're not familiar with Perl, don't worry about
what that means). And C has no equivalent to $/ (which in Perl lets
you set the input record separator to something other than the default
"\n").
So a reasonable C chomp() would operate on a single string, would
remove the last character if and only if it's a '\n', and would return
1 if it removed a character and 0 if it didn't.
Jordan, your version clobbers the last '\n' in the string, even if
it's not at the end of the string.
Here's my attempt:
int chomp(char *s)
{
size_t len = strlen(s);
if (len == 0) {
return 0;
}
else if (s[len-1] == '\n') {
s[len-1] = '\0';
return 1;
}
else {
return 0;
}
}
I did mess up.
How about
chomp(s)
char *s;
{
if(s && *s) {
char *p = strrchr(s,0);
if(p[-1]=='\n') {
p[-1]=0;
return 1;
}
}
return 0;
}
may be slightly more efficient than yours if the compiler doesn't get
especially clever with strlen calls.
I threw in null pointer handling because it's practically free.
You could add an int INPUT_RECORD_SEPARATOR; variable, but for it to be
useful you'd need an fgets replacement.
.
- Follow-Ups:
- Re: equivalent of chomp in perl
- From: Flash Gordon
- Re: equivalent of chomp in perl
- References:
- equivalent of chomp in perl
- From: lnatz
- Re: equivalent of chomp in perl
- From: CBFalconer
- Re: equivalent of chomp in perl
- From: Keith Thompson
- Re: equivalent of chomp in perl
- From: CBFalconer
- Re: equivalent of chomp in perl
- From: Keith Thompson
- Re: equivalent of chomp in perl
- From: Jordan Abel
- Re: equivalent of chomp in perl
- From: Keith Thompson
- equivalent of chomp in perl
- Prev by Date: Re: Cannot return values of char variable
- Next by Date: bit shifts across array elements
- Previous by thread: Re: equivalent of chomp in perl
- Next by thread: Re: equivalent of chomp in perl
- Index(es):
Relevant Pages
|
|