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
Solved

string manipulation

Posted on 2000-03-13
11
233 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
Does Powershell have you tied up in knots?

Managing Active Directory does not always have to be complicated.  If you are spending more time trying instead of doing, then it's time to look at something else. For nearly 20 years, AD admins around the world have used one tool for day-to-day AD management: Hyena. Discover why

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

Connect further...control easier

With the ATEN CE624, you can now enjoy a high-quality visual experience powered by HDBaseT technology and the convenience of a single Cat6 cable to transmit uncompressed video with zero latency and multi-streaming for dual-view applications where remote access is required.

Question has a verified solution.

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

An Outlet in Cocoa is a persistent reference to a GUI control; it connects a property (a variable) to a control.  For example, it is common to create an Outlet for the text field GUI control and change the text that appears in this field via that Ou…
Examines three attack vectors, specifically, the different types of malware used in malicious attacks, web application attacks, and finally, network based attacks.  Concludes by examining the means of securing and protecting critical systems and inf…
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.
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.

789 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