Wyszukiwanie liczby w tekście

0

Witam was serdecznie. Mam problem z jednym zadaniem. Mianowicie z danej komendy chciałbym wyciągnąć cyfry. Przykładowo, jeśli komenda brzmi "TEST04" to chciałbym, aby zostały wyciągnięte cyfry 0 oraz 4 i potem przeniesione do zmiennej jako 4. Oczywiście mogą być też dwie cyfry jak np.: 1, 2 i wtedy robimy 12. Wynik jest przechowywany w zmiennej liczba. Niestety w kodzie poniżej zostaje wyciągnięta tylko ostatnia cyfra oraz jest zapisywana w formacie ASCI. Co muszę zrobić żeby program działał prawidłowo?

int main()
{
    		
	    char * komenda = "KOMENDA01";
		int dlugosc = strlen(komenda);
		int liczba;
	    for (int i = 0; i < dlugosc; i++)
	    {
	        if (isdigit(komenda[i])){
	            liczba = komenda[i];
	        }
	    }
	    printf("%d", liczba);

    return 0;
}

1

@RockySQL:

Małą podpowiedź

Znak pisarski, cyfra '1' to nie jest liczba 1

Generalnie każdy ktoś skończył matematykę w podstawówce, chyba że miał strasznie brzydką panią od matmy, to odróżnia

3

Moja propozycja:

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

int main()
{

      // zakładamy, że interesuje nas wyłącznie ostatni ciąg cyfr 
	
      char * komenda = "KOMENDA15";
		int dlugosc = strlen(komenda);
		int liczba=0;
  
	  for (int i = 0; i < dlugosc; i++)
	  {
	    if (isdigit(komenda[i])){
	      liczba = liczba * 10 + ( komenda[i] - '0');
	    } else {
        // zerujemy liczbę gdy znak nie będzie to cyfrą
        liczba=0;
      }
	  }
	    
	  printf("%d", liczba);
      return 0;
}
2

Propozycja od @Robert Karpiński ma 3 wady:

  1. Wyświetli 0 jeżeli w napisie brak cyfr. np: char * komenda = "Brak Cyfr";;
  2. Obetnie przodujące zera. np: char * komenda = "Agent 007";;
  3. Przy dłuższym ciągu cyfr może nastąpić przepełnienie int'a więc zobaczy nie to co oczekiwaliśmy. np: char * komenda = "Wow99999999999999999999999999999999999999999999";;

Więc w zasadzie nieznacznie dłuższy ale bez wad:

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

int main()
{
	const char *komenda="KOMENDA01";
	const char *start=0;
	int len=0;
	for(int digit=0,i=0;komenda[i];++i)
	{
		if(isdigit(komenda[i]))
		{
			if(!digit)
			{
				len=0;
				start=komenda+i;
				digit=1;
			}
			++len;
		}
		else digit=0;
	}
	if(start) for(int i=0;i<len;++i) printf("%c",start[i]);
	else printf("nie ma liczby w napisie");
    return 0;
}
1

ad 1. Nie było takiego wymogu,
ad 2. W założeniach napisano : ""TEST04" to chciałbym, aby zostały wyciągnięte cyfry 0 oraz 4 i potem przeniesione do zmiennej jako 4",
ad 3. tak, to może się stać, ale niech autor pytania sam obsłuży w/w aspekt - o ile jest to mu potrzebne :)

2
template <typename Ch>
constexpr auto digits();

template <>
constexpr auto digits<char>()
{
    return std::basic_string_view { "0123456789" };
}

template <>
constexpr auto digits<wchar_t>()
{
    return std::basic_string_view { L"0123456789" };
}

template <typename Ch>
auto findNumbers(std::basic_string_view<Ch> s) -> std::vector<std::basic_string_view<Ch>>
{
    constexpr auto d = digits<Ch>();
    auto index = s.find_first_of(d);

    std::vector<std::basic_string_view<Ch>> r;
    while (index != std::basic_string_view<Ch>::npos) {
        auto end = s.find_first_not_of(d, index);
        r.emplace_back(s.substr(index, end - index));
        index = s.find_first_of(d, end);
    }
    return r;
}

template <typename Ch, size_t N>
auto findNumbers(const Ch (&s)[N]) -> std::vector<std::basic_string_view<Ch>>
{
    return findNumbers(std::basic_string_view<Ch>{s});
}

template <typename Ch>
auto findNumbers(const std::basic_string<Ch>& s) -> std::vector<std::basic_string_view<Ch>>
{
    return findNumbers(std::basic_string_view<Ch>{s});
}

https://godbolt.org/z/b1axb671n

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