Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

string manipulation

Posted on 2000-03-13
11
Medium Priority
?
240 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
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
 
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 450 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

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

Question has a verified solution.

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

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…
Windows programmers of the C/C++ variety, how many of you realise that since Window 9x Microsoft has been lying to you about what constitutes Unicode (http://en.wikipedia.org/wiki/Unicode)? They will have you believe that Unicode requires you to use…
The goal of this video is to provide viewers with basic examples to understand recursion in the C programming language.
The goal of this video is to provide viewers with basic examples to understand how to use strings and some functions related to them in the C programming language.

596 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