Jak ominac znak "_" ?

0

Witam,
mam do napisania program, ktory sortuje liczby i w jednym przypadku mam problem: gdy podaje liczbe 834_43 chce aby program bral pod uwage liczbe 83443 i nie wiem jak ominac znak "_" w srodku liczby. Wklejam kawalek kodu w ktorym mam problem:

 int compare( const void *str1, const void *str2)
{
	int value;
	char* curr1;
	char* curr2;

	curr1=*(char**)str1;
	curr2=*(char**)str2;

	while(*curr1=='0' || *curr1=='_') curr1++; 
	while(*curr2=='0' || *curr2=='_') curr2++;
	
	if(strlen(curr1) < strlen(curr2)) return -1;
	if(strlen(curr1) > strlen(curr2)) return 1;

	value=strcmp(curr1, curr2);

	return value;
}
0

Ja rozplanowałbym to trochę inaczej.
Po pierwsze po co przesyłać jako parametr void* ? Zdecydowanie sensowniej było by przesyłać char*.
Po drugie istnieje taka funkcja jak atoi (stdlib.h), zamienia ona char* na int.
I teraz główna część. Spróbuj w ten sposób:
Bierzesz pierwszy znak, jeżeli jest on zwykłą cyfrą, lub minusem, o ile stoi on na pierwszym miejscu, to przepisujesz go do drugiej tablicy. I robisz tak aż do momentu jak napotkasz znak końca napisu ( '\0'). Wtedy przepisujesz też ten znak. Następnie przepuszczasz ten napis przez atoi, i wtedy otrzymujesz normalny int, robisz to samo dla drugiego napisu (najlepiej daj to wszystko w osobną funkcję), który możesz sobie łatwo porównać :)

0

Zellus, w zadaniu chodzi chyba o to, ze ciagi mogą być nieskończenie długie i nie mieścić się w long long ;]
All0star, o ile to zadanie, o którym myśle, zakładam, że masz funkcję getNumber i w niej

if(isdigit(c) || c == '_')
{
//kod
} else
{
  return 0;
}

.
Spróbuj może:

if(isdigit(c))
{
//kod
} else
{
  if(c == '_')
    continue;
  else
    return 0;
}
0
Zellus napisał(a):

po co przesyłać jako parametr void* ? Zdecydowanie sensowniej było by przesyłać char*.

A jeszcze sensowniej const char*

0

Zastanów się czy nie pozbyć się tych znaków '_' wcześniej.

int compare(const void *A,const void *B)
  {
   int diff;
   char *a,*b;
   a=*(char**)A;
   b=*(char**)B;
   while(true)
     {
      if(*a=='_') ++a;
      else if(*b=='_') ++b;
      else if(((diff=*a-*b)!=0)||(!*a)) return diff; // ||(!*b) - można nie dodawać
      ++a;
      ++b;
     }
  }
0

Ten problem chyba juz rozwiazalem, cos takiego z pomoca stworzylem:

int compare(const void *str1, const void *str2)
{
	char* curr1;
	char* curr2;
	
	int value = 0;
	size_t len1 = 0;
	size_t len2 = 0;

	curr1=*(char**)str1;
	curr2=*(char**)str2;

	while(*curr1=='0' || *curr1=='_') curr1++; 
	while(*curr2=='0' || *curr2=='_') curr2++;
	
	
	
	while(*curr1 || *curr2)
	{
		while(*curr1 == '_')
			curr1++;
		while(*curr2 == '_')
			curr2++;

		if(value == 0)
		{
			value = *curr1 - *curr2;
		}
		if(*curr1)
		{
			curr1++;
			len1++;
		}
		if(*curr2)
		{
			curr2++;
			len2++;
		}
	}
	
	if(len1 != len2)
	{
		return (len1 > len2) ? 1 : -1;
	}
	
	return value;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1