Re: equivalent of chomp in perl
- From: Keith Thompson <kst-u@xxxxxxx>
- Date: Fri, 03 Nov 2006 22:37:57 GMT
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;
}
}
Another difference from Perl is that C arrays don't re-size
themselves. In Perl, strings are first-class objects. In C, a string
is data format, not a data type; if you shorten a string like this,
the remainder of the string is still there in the array. (A C dynamic
string library would probably deal with this.)
--
Keith Thompson (The_Other_Keith) kst-u@xxxxxxx <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
.
- Follow-Ups:
- Re: equivalent of chomp in perl
- From: Jordan Abel
- 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
- equivalent of chomp in perl
- Prev by Date: Re: equivalent of chomp in perl
- Next by Date: Re: Weird link list problem
- Previous by thread: Re: equivalent of chomp in perl
- Next by thread: Re: equivalent of chomp in perl
- Index(es):
Relevant Pages
|
|