Solved

string manipulation

Posted on 2000-03-13
11
231 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
ID: 2613148
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
ID: 2613157
I am 100% sure that I have allocated enough space for all of them.
0
 
LVL 31

Expert Comment

by:Zoppo
ID: 2613166
Hi anemos,

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

ZOPPO      
0
 
LVL 1

Expert Comment

by:ntdragon
ID: 2613334
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
ID: 2613875
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
Are your end users making ugly email signatures?

Have you left it up to your end users to create their own email signatures? Are they forgetting to add the company logo or using garish font colors? Take control and ensure all users have the same email signature.

 
LVL 10

Expert Comment

by:makerp
ID: 2615132
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
ID: 2615135
sorry the indentation has been trashed for some reason
0
 
LVL 10

Expert Comment

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

Author Comment

by:anemos
ID: 2615452
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
ID: 2615458
well if i could cause i can't see a label saying accept comment as answer..
0
 
LVL 1

Expert Comment

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

Featured Post

Do email signature updates give you a headache?

Constantly trying to correctly format email signatures? Spending all of your time at every user’s desk to make updates? Want high-quality HTML signatures on all devices, including on mobiles and Macs? Then, let Exclaimer solve all your email signature problems today!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

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…
Summary: This tutorial covers some basics of pointer, pointer arithmetic and function pointer. What is a pointer: A pointer is a variable which holds an address. This address might be address of another variable/address of devices/address of fu…
The goal of this video is to provide viewers with basic examples to understand how to create, access, and change arrays in the C programming language.
The goal of this video is to provide viewers with basic examples to understand and use conditional statements in the C programming language.

911 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

15 Experts available now in Live!

Get 1:1 Help Now