954,164 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

extract multidigits from a char* (substring)

Hi,
given a cstring, I need to extract the digits in it, the digits are prefixed with either a '+' or '-'. Like

,.,.,.,+3ACT,.,.,.,.-12,.,.,.,.,.,.,.,actgncgt
#OUTPUT
3
12


I've made a working program that does what I want,
but it seems overly complicated.
Does anyone have an idea if this can be done smarter, better, faster?

Thanks in advance

Btw I checked the program with valgrind and there are no leaks or errors

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(){
  char tmp_array[100];
  const char* seq = "+1236,,..,,actgn+3ACT-4CCCC";
  printf("%s\n",seq);

  for(int i=0;i<strlen(seq);i++){
    if(seq[i]!='+'&&seq[i]!='-')
      continue;
    int j=i+1;
    while(j<strlen(seq)){
      if(seq[j]>='0' &&seq[j]<='9'){
	j++;
      }else
	break;
      
    }
    strncpy(tmp_array,seq+i+1,j-i-1);
    tmp_array[j-i-1]='\0';
    printf("numbers in substrings are: %d\n",atoi(tmp_array));
  }
  
  return 0;
}
monkey_king
Junior Poster
160 posts since Aug 2008
Reputation Points: 70
Solved Threads: 9
 
Does anyone have an idea if this can be done smarter, better, faster?

check out: strtok() ... this breaks a string into tokens at each of one or more delimiters.

use it to break the string at each '+' or '-' (the delimiters), then check if the first one or more characters of each resulting string (the tokens) are numerals.

if it does, then push that number onto your result array. if it doesn't, skip on to the next token.


.

jephthah
Posting Maven
2,587 posts since Feb 2008
Reputation Points: 2,143
Solved Threads: 179
 

untested but here...

int main()
{
  char tmp_array[100];
  const char* seq = "+1236,,..,,actgn+3ACT-4CCCC";
  printf("%s\n",seq);

   while (*seq)
   {        // pre-scan for +-
      if (*seq != '-' && *seq != '+')
      {
         seq++;
         continue;
      }

      char *p = tmparray;
	  *p++ = *seq++;

      while (*seq)
	  {
	      if ((*seq < '0') || ('9' < *seq))
		  { 
		     break;
	      }

          *p++ = *seq++;
	   }

       *p = 0;

       printf("numbers in substrings are: %d\n",atoi(tmp_array)); 
  } 

  return 0;
}
wildgoose
Practically a Posting Shark
896 posts since Jun 2009
Reputation Points: 546
Solved Threads: 99
 

But if allowed to use off the shelf library functions, then poster jephthah has the right idea!

wildgoose
Practically a Posting Shark
896 posts since Jun 2009
Reputation Points: 546
Solved Threads: 99
 

why dont you put an array with stuff you want and extract that to new array?

MrNoob
Posting Whiz in Training
218 posts since May 2009
Reputation Points: 34
Solved Threads: 7
 

Double the processing time. No optimal!

Why process a list twice when you can do it once!

wildgoose
Practically a Posting Shark
896 posts since Jun 2009
Reputation Points: 546
Solved Threads: 99
 

wildgoose: posting "Untested" code on daniweb's C forum is generally risky business :P

anyhow, being able to use strtok() correctly is tricky for a new user. Also make sure you understand what is going on with strtol()

char string[100]="+1236,,..,,actgn+3ACT-4CCCC";
char *token, *ptr;
int value;
	
token = strtok(string,"+-");
printf ("found numbers: ");
	
while (token != NULL)
{	
	value = strtol(token,&ptr,10);
	if (ptr != token)
		printf(" %d,",value);

	token = strtok(NULL,"+-");
}
printf("\n");

.

jephthah
Posting Maven
2,587 posts since Feb 2008
Reputation Points: 2,143
Solved Threads: 179
 

Thanks ppl,
I need to keep track of the indices,
so the strtok approch wont work.

But thanks again.

monkey_king
Junior Poster
160 posts since Aug 2008
Reputation Points: 70
Solved Threads: 9
 

well, that's a nice bit of feature creep to throw out there at the last minute.

do you work in marketing?

jephthah
Posting Maven
2,587 posts since Feb 2008
Reputation Points: 2,143
Solved Threads: 179
 

Thanks ppl, I need to keep track of the indices, so the strtok approch wont work.

But thanks again.


The strtok() approach will work, just with a little added overhead - specifically, tracking the size of tokens you have already passed and either used or discarded.

YrthWyndAndFyre
Newbie Poster
7 posts since Jul 2009
Reputation Points: 24
Solved Threads: 1
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You