Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > problem with removing spaces in the string

Reply
Thread Tools

problem with removing spaces in the string

 
 
ramu
Guest
Posts: n/a
 
      09-19-2007
Hi,

Suppose I have a string like this:

"I have a string \"and a inner string\\\" I want to remove space in
this string but not in the inner string"

In the above string I have to remove spaces, but not in the inner
string(\"and a inner string\\\"). Will anyone please tell me how to do
this?

regards

 
Reply With Quote
 
 
 
 
Ralf Damaschke
Guest
Posts: n/a
 
      09-19-2007
ramu wrote:

> Suppose I have a string like this:
>
> "I have a string \"and a inner string\\\" I want to remove
> space in this string but not in the inner string"
>
> In the above string I have to remove spaces, but not in the
> inner string(\"and a inner string\\\"). Will anyone please
> tell me how to do this?


No problem. I suppose you have an input like

char s[] = "I have a string \"and a inner string\\\" I want"
" to remove space in this string but not in the "
"inner string";

Just start removing spaces while you walk through the string;
whenever you see a '"' suspend the space removal and when you
see another '"' resume it. Don't forget to stop at the end of
the string.

Ralf
 
Reply With Quote
 
 
 
 
osmium
Guest
Posts: n/a
 
      09-19-2007
"ramu" writes:

> Suppose I have a string like this:
>
> "I have a string \"and a inner string\\\" I want to remove space in
> this string but not in the inner string"
>
> In the above string I have to remove spaces, but not in the inner
> string(\"and a inner string\\\"). Will anyone please tell me how to do
> this?


Set a flag indicating you have encountered the first delimiter. Think of one
or more _states_. Search for information on modes and states and state
diagrams if you still have trouble.


 
Reply With Quote
 
ramu
Guest
Posts: n/a
 
      09-19-2007
On Sep 19, 12:16 pm, "osmium" <(E-Mail Removed)> wrote:
> "ramu" writes:
> > Suppose I have a string like this:

>
> > "I have a string \"and a inner string\\\" I want to remove space in
> > this string but not in the inner string"

>
> > In the above string I have to remove spaces, but not in the inner
> > string(\"and a inner string\\\"). Will anyone please tell me how to do
> > this?

>
> Set a flag indicating you have encountered the first delimiter. Think of one
> or more _states_. Search for information on modes and states and state
> diagrams if you still have trouble.


I have done like this:
char *strrmspace (char *s )
{
char *sptr = s;
char *instr = s;
char *outstr;
int i = 0;
boolean found_quote = FALSE;

outstr = (char * )malloc(strlen(s)+1);

while ( *instr != '\0')
{
if ( found_quote )
{
outstr[i++] = *instr;
}
else
{
if ( !isspace( *instr) )
{
outstr[i++] = *instr;
}
}

if (( *instr == '"') && ( instr[-1] != '\\'))
{
found_quote = !found_quote;
}
instr++;
} /* while */
outstr[i] = '\0';
(void)strcpy(s, outstr);
free (outstr);
return(sptr);
} /* strrmspace */

And if I have a string

char s[] = "I have a string \"\\\" I want to remove space in this
string but not in the \"inner string\" ";

But this is removing spaces in \"inner string\" when there is
backslash in the previous inner string ie. \"\\\".
I don't want to remove the spaces in the inner strings. How can I
achieve this?

regards


 
Reply With Quote
 
Walter Roberson
Guest
Posts: n/a
 
      09-19-2007
In article <(E-Mail Removed). com>,
ramu <(E-Mail Removed)> wrote:

>Suppose I have a string like this:


>"I have a string \"and a inner string\\\" I want to remove space in
>this string but not in the inner string"


>In the above string I have to remove spaces, but not in the inner
>string(\"and a inner string\\\"). Will anyone please tell me how to do
>this?


Incomplete specification.
- Do inner strings nest?
- why is the ending delimeter for the inner string \\\" instead
of \" ? What should happen if a \" appears in the inner string?
--
Okay, buzzwords only. Two syllables, tops. -- Laurie Anderson
 
Reply With Quote
 
Fred Kleinschmidt
Guest
Posts: n/a
 
      09-19-2007

"ramu" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed) oups.com...
> On Sep 19, 12:16 pm, "osmium" <(E-Mail Removed)> wrote:
>> "ramu" writes:
>> > Suppose I have a string like this:

>>
>> > "I have a string \"and a inner string\\\" I want to remove space in
>> > this string but not in the inner string"

>>
>> > In the above string I have to remove spaces, but not in the inner
>> > string(\"and a inner string\\\"). Will anyone please tell me how to do
>> > this?

>>
>> Set a flag indicating you have encountered the first delimiter. Think of
>> one
>> or more _states_. Search for information on modes and states and state
>> diagrams if you still have trouble.

>
> I have done like this:
> char *strrmspace (char *s )
> {
> char *sptr = s;
> char *instr = s;
> char *outstr;
> int i = 0;
> boolean found_quote = FALSE;
>
> outstr = (char * )malloc(strlen(s)+1);
>
> while ( *instr != '\0')
> {
> if ( found_quote )
> {
> outstr[i++] = *instr;
> }
> else
> {
> if ( !isspace( *instr) )
> {
> outstr[i++] = *instr;
> }
> }
>
> if (( *instr == '"') && ( instr[-1] != '\\'))
> {
> found_quote = !found_quote;
> }
> instr++;
> } /* while */
> outstr[i] = '\0';
> (void)strcpy(s, outstr);
> free (outstr);
> return(sptr);
> } /* strrmspace */
>
> And if I have a string
>
> char s[] = "I have a string \"\\\" I want to remove space in this
> string but not in the \"inner string\" ";
>
> But this is removing spaces in \"inner string\" when there is
> backslash in the previous inner string ie. \"\\\".
> I don't want to remove the spaces in the inner strings. How can I
> achieve this?
>
> regards
>
>

When you encounter a quote, check the previous character to see
whether that quote is escaped or not.
--
Fred L. Kleinschmidt
Boeing Associate Technical Fellow
Aero Stability and Controls Computing


 
Reply With Quote
 
osmium
Guest
Posts: n/a
 
      09-19-2007
"ramu" wrote:

> I have done like this:
> char *strrmspace (char *s )
> {
> char *sptr = s;
> char *instr = s;
> char *outstr;
> int i = 0;
> boolean found_quote = FALSE;
>
> outstr = (char * )malloc(strlen(s)+1);
>
> while ( *instr != '\0')
> {
> if ( found_quote )
> {
> outstr[i++] = *instr;
> }
> else
> {
> if ( !isspace( *instr) )
> {
> outstr[i++] = *instr;
> }
> }
>
> if (( *instr == '"') && ( instr[-1] != '\\'))
> {
> found_quote = !found_quote;
> }
> instr++;
> } /* while */
> outstr[i] = '\0';
> (void)strcpy(s, outstr);
> free (outstr);
> return(sptr);
> } /* strrmspace */
>
> And if I have a string
>
> char s[] = "I have a string \"\\\" I want to remove space in this
> string but not in the \"inner string\" ";


See, I don't know what the word this applies to. We are not communicating.
Furthermore, I don't *want* to know. You have to have rigorous definitions
to have conversations such as the one you are attempting.

> But this is removing spaces in \"inner string\" when there is
> backslash in the previous inner string ie. \"\\\".
> I don't want to remove the spaces in the inner strings. How can I
> achieve this?


The link is not very good but it might help. This is a very simple thing
but it is almost impossible to describe without the ability to make
drawings. You have states and there are certain characters, sometimes
called terminals, that change the state, perhaps the quote or left slash in
your example. Or perhaps both, I didn't try to follow the details of what
you want. You can have an unlimited number of states. There is no
requirement for any kind of symmetry in a state diagram, simple examples
might give you that impression. You might also look up meta-language. I
think you are using quote and left backslash as a meta language in your
posts.


http://en.wikipedia.org/wiki/State_diagram


 
Reply With Quote
 
ramu
Guest
Posts: n/a
 
      09-19-2007
On Sep 19, 2:13 pm, (E-Mail Removed)-cnrc.gc.ca (Walter Roberson)
wrote:
> In article <(E-Mail Removed). com>,
>
> ramu <(E-Mail Removed)> wrote:
> >Suppose I have a string like this:
> >"I have a string \"and a inner string\\\" I want to remove space in
> >this string but not in the inner string"
> >In the above string I have to remove spaces, but not in the inner
> >string(\"and a inner string\\\"). Will anyone please tell me how to do
> >this?

>
> Incomplete specification.
> - Do inner strings nest?
> - why is the ending delimeter for the inner string \\\" instead
> of \" ? What should happen if a \" appears in the inner string?
> --
> Okay, buzzwords only. Two syllables, tops. -- Laurie Anderson


No. inner strings do not nest. But inner strings can contain one or
more double quote and/or one or more back slash.
The delimiter is double quote and \\ is the part of the inner
string.

The user input might be like this:

"I have a string "\\" I want to remove space in
this "string but not in the" "\"" inner string"

Regards

 
Reply With Quote
 
Army1987
Guest
Posts: n/a
 
      09-19-2007
On Wed, 19 Sep 2007 08:56:18 -0700, ramu wrote:

> Hi,
>
> Suppose I have a string like this:
>
> "I have a string \"and a inner string\\\" I want to remove space in
> this string but not in the inner string"
>
> In the above string I have to remove spaces, but not in the inner
> string(\"and a inner string\\\"). Will anyone please tell me how to do
> this?


Use a status variable, initialized to (e.g. 0). Loop through the
source. If a character is whitespace, copy it only if the status
is 0. If it is a quotation mark, toggle the status, and copy it
to the target. Else, copy it to the target. A switch statement in
a loop will do that.
--
Army1987 (Replace "NOSPAM" with "email")
If you're sending e-mail from a Windows machine, turn off Microsoft's
stupid “Smart Quotes” feature. This is so you'll avoid sprinkling garbage
characters through your mail. -- Eric S. Raymond and Rick Moen

 
Reply With Quote
 
Barry Schwarz
Guest
Posts: n/a
 
      09-20-2007
On Wed, 19 Sep 2007 09:53:54 -0700, ramu <(E-Mail Removed)> wrote:

>On Sep 19, 12:16 pm, "osmium" <(E-Mail Removed)> wrote:
>> "ramu" writes:
>> > Suppose I have a string like this:

>>
>> > "I have a string \"and a inner string\\\" I want to remove space in
>> > this string but not in the inner string"

>>
>> > In the above string I have to remove spaces, but not in the inner
>> > string(\"and a inner string\\\"). Will anyone please tell me how to do
>> > this?

>>
>> Set a flag indicating you have encountered the first delimiter. Think of one
>> or more _states_. Search for information on modes and states and state
>> diagrams if you still have trouble.

>
>I have done like this:


Not a bad first effort.

>char *strrmspace (char *s )


Unfortunately, you have chosen a reserved name for your function.

>{
> char *sptr = s;
> char *instr = s;
> char *outstr;
> int i = 0;
> boolean found_quote = FALSE;
>
> outstr = (char * )malloc(strlen(s)+1);


Don't cast the return from malloc. It can never help but can lead to
silencing a diagnostic you would really want to see.

>
> while ( *instr != '\0')
> {
> if ( found_quote )
> {
> outstr[i++] = *instr;
> }
> else
> {
> if ( !isspace( *instr) )


isspace returns true for characters other than ' '.

> {
> outstr[i++] = *instr;
> }
> }
>
> if (( *instr == '"') && ( instr[-1] != '\\'))


This will cause undefined behavior if a " is the first character of
the input string.

> {
> found_quote = !found_quote;
> }
> instr++;
> } /* while */
> outstr[i] = '\0';
> (void)strcpy(s, outstr);


Why the cast?

> free (outstr);
> return(sptr);


sptr was set to s and neither was ever modified. It looks like you
don't need sptr and can return s. return is a statement, not a
function; the parentheses are unnecessary.

>} /* strrmspace */
>
>And if I have a string
>
> char s[] = "I have a string \"\\\" I want to remove space in this
>string but not in the \"inner string\" ";
>
>But this is removing spaces in \"inner string\" when there is
>backslash in the previous inner string ie. \"\\\".
>I don't want to remove the spaces in the inner strings. How can I
>achieve this?


It would avoid ambiguity if you would specify the desired output after
processing the above array and show us the output your function is
producing.

One problem you may think you have is that the \" you see after the
first word string is not two characters at execution time. It is
acutely the start of your inner string which continues until the \"
before the word inner. The phrase inner string is part of your outer
string and should be stripped.


Remove del for email
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
[CSS] how can I show spaces as spaces? Tomasz Chmielewski HTML 21 09-10-2009 06:43 PM
how can I show spaces as spaces, part 2 Tomasz Chmielewski HTML 14 09-10-2009 03:54 PM
Re: How to trim a String trailing spaces, but not leading spaces? Roedy Green Java 3 09-14-2008 02:10 AM
Re: How to trim a String trailing spaces, but not leading spaces? John B. Matthews Java 4 09-12-2008 05:28 AM
How can I search and replace a string while preserving (not removing) trailing spaces? rsarpi Perl Misc 1 05-13-2007 04:29 AM



Advertisments