Solved

string manipulation

Posted on 2000-03-13
11
230 Views
Last Modified: 2010-04-15
do {
    while (*copy=='F' && *copy!=0) ++copy;

    if (*copy==0) break;
    while (*copy!='F' && *copy!=0) {*ptr=*copy; ++ptr; ++copy;};
    if (*copy==0) break;
     
    ++ptr;
    *ptr=0;
   

    strcat(ptr,transform);

  } while (1); /* condition of the loop is tested in the 2nd statement */

=======================================

When this loop is compiled I get a bus error.

What this is meant to do is the following.

copy holds a string.
ptr is empty.
transform holds a string as well.

they have all been declared as char * and have been allocated enough space using malloc.

I want to copy the contents of the variable copy into the variable ptr but whenever there is a char 'F' in the variable copy instead of copying 'F' into ptr copy the whole contents of transform into ptr.

 for example

 copy = "ggfhhhFoooFl"

 transform="555"

 so the result I want should be:

 ptr = " ggfhhh555ooo555l"


 I hope I am clear enough.
0
Comment
Question by:anemos
  • 4
  • 3
  • 2
  • +2
11 Comments
 
LVL 3

Expert Comment

by:Iexpert
Comment Utility
Is the second ++ptr; required?
Are you sure you allocated enough space for ptr ?
Note in your e.g. it must be @ least be strlen(copy)*strlen(transform)
0
 

Author Comment

by:anemos
Comment Utility
I am 100% sure that I have allocated enough space for all of them.
0
 
LVL 30

Expert Comment

by:Zoppo
Comment Utility
Hi anemos,

Iexpert is right, remove the
   ++ptr;
before th
   *ptr=0;

ZOPPO      
0
 
LVL 1

Expert Comment

by:ntdragon
Comment Utility
1)try to use '\0' instead of 0

2)i thing that you got a logic mistake in the first while:
>> while (*copy=='F' && *copy!=0) >>++copy;
'cause if *copy=='F' it ofcourse !=0

3)you do ++ptr then *ptr=0 why do you do the ++ptr ptr points to the next empty place each time so you don't need to do the ++ptr

4)you do strcat(ptr,transform) but ptr doesn't point to the biggining of the string
you have to keep another pointer that will point to the biggining of ptr like
char *start
start=ptr
and then enter you loop
and instead of strcat(ptr,transform)
do strcat(start,transform);

5)after you do strcat you don't move ptr to the end of the string

6) did you hear about a func named strtok
and about strcat don't forget that it doesn't put '\0' at the end

7)
char *start=ptr;
while (*copy!='\0'){
   while(*copy!='F'&&*copy!='\0'){
      *ptr=*copy;
       ptr++;
       copy++;
   }
   *ptr='\0';
   if (*copy=='F'){
      strcat(start,transform);
      ptr+=strln(transform)+1;
   }
}
i think that should work for you
<i writed it here i mean i didn't compile it but i think it will work>
but you can use strtok and strcat it will be much easyer i just don't know if you want to use them so i didn't use it
   

 
   
0
 
LVL 10

Expert Comment

by:makerp
Comment Utility
the follwing should solve your problem its a function which i use two swap a single quote in a string with 2 quotes (escaping sql)

char *replace(char *in_string, char *rep_with, char rep)

it return a new string leaving the old one in tackt..

////////////////////////////////////

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <conio.h>

char *replace(char *string, char *rep_with, char rep_on)
{
      char *new_s = NULL;
   int i = 0, a = 0;

   new_s = (char*)malloc(strlen(string) + 1);
   if(new_s)
   {
         for(i=0;i<strlen(string);i++)
      {
             if(string[i] != rep_on)
         {
                new_s[a] = string[i];
            new_s[a + 1] = '\0';
            a++;
         }
         else
         {
               new_s = (char*)realloc(new_s,strlen(rep_with) + 2 + strlen(new_s));
            if(new_s)
            {
                   strcat(new_s,rep_with);
               a = a + strlen(rep_with);
            }
         }
      }
   }
   return new_s;
}

void main()
{

      printf("%s\n",replace("helloFpaulFhowFareFyouFtodayFmumma"," - ",'F'));

      getch();
   }
}

hope this helps
0
IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 
LVL 10

Expert Comment

by:makerp
Comment Utility
SORRY the above is wrong.. this is right. iut works ive just tested it .>

char *replace(char *buf,  char *with, char rep)
{
      int i = 0;
      char *c, *t, temp[2];
      /* get the number of ampersnads */
      t = buf;
      do
      {      
            c = strchr(t,rep);
            if(c)
            {
                  i++;
                  t = c + 1;
            }
      }while(c);
      
      c = (char*)malloc((i * strlen(with)) + (strlen(buf) - i) + 10);
      if(c)
      {
            strcpy(c,"");
            for(i=0;i<=strlen(buf);i++)
            {
                  if(buf[i] == rep)
                  {
                        strcat(c,with);
                  }
                  else
                  {
                        temp[0] = buf[i];
                        temp[1] = '\0';
                        strcat(c,temp);
                  }
            }
      }
      return c;
}

doews this solve your probelem
0
 
LVL 10

Accepted Solution

by:
makerp earned 150 total points
Comment Utility
sorry the indentation has been trashed for some reason
0
 
LVL 10

Expert Comment

by:makerp
Comment Utility
also the malloc grabs an extra 10, thats a typo it should be 1 for the NULL
0
 

Author Comment

by:anemos
Comment Utility
I am afraid Makerp that I'll have to give the point to ntdragon as he first gave me a satisfactory answer.
 Thanx for your help guys..
 catch u later...
0
 

Author Comment

by:anemos
Comment Utility
well if i could cause i can't see a label saying accept comment as answer..
0
 
LVL 1

Expert Comment

by:ntdragon
Comment Utility
the most important is that we were able to help you:>
0

Featured Post

Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Suggested Solutions

Have you thought about creating an iPhone application (app), but didn't even know where to get started? Here's how: ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Important pre-programming comments: I’ve never tri…
Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small…
The goal of this video is to provide viewers with basic examples to understand recursion in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use for-loops in the C programming language.

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now