Wczytywanie danych oddzielonych znakami

0

Witam!

Muszę napisać program, który będzie sumował dwie macierze o maksymalnych wymiarach 5x5. Nie byłoby w tym nic trudnego, ale liczba wierszy i kolumn nie jest specyfikowana przez użytkownika. Program powinien ją odczytać z wartości wpisanych przez użytkownika. Chciałem to zrobić w ten sposób, że użytkownik podaje elementy macierzy leżące w tym samym wierszu oddzielając je spacją, a jeżeli chce podać elementy z kolejnego wiersza to używa znaku #.
Przykład:

12 45 567#657 12 98

odpowiada macierzy:

12 45 567
657 12 98

Nie wiem jednak jak się za napisanie funkcji pobierającej od użytkownika taki ciąg i wpisujący elementy do tablicy dwuwymiarowej [4][4] (nie musi być zrobiona dynamicznie).

Ma ktoś pomysł jak napisać taką funkcję? Ponadto musi ona sprawdzać czy w każdym wierszu jest taka sama ilość kolumn, gdyż




nie będzie macierzą oraz to czy użytkownik gdzieś przez pomyłkę nie wklepał literek albo dwóch spacji.

Pozdrawiam i liczę na pomoc:)

0

@up
trochę przykład z gwiazdkami mi nie wyszedł:p
Chodziło mi, że musi być zabezpieczenie przed:
12 45 56
78 56 34 48
18

0

Sorry, że jeszcze raz piszę oddzielny post ale tamtych nie mogę edytować, bo nie byłem zarejestrowany. Program musi być napisany w C, nie w C++, bo tego nie napisałem.

0

niestety zadanie jest zbyt proste żebyś mógł liczyć na pomoc. Albo bierzesz się w garść i do nauki albo napisz post w dziale praca - za lenistwo się płaci.

0

Ale o jakie lenistwo Ci chodzi? Ja nie proszę o gotową funkcję tylko o pomoc z jakich innych funkcji skorzystać, żeby wczytać te dane? Jestem początkujący, chcę się uczyć i nie chcę gotowego programu. Myślałem, żeby wczytać dane od użytkownika do bufora przez:

 while (getchar() != '\n')
continue;

Tylko nie wiem czy dobrze myślę, a jeśli tak to za pomocą jakiej funkcji mógłbym wyłuskać ze stringa podanego przez użytkownika dane potrzebne do wpisania do tablicy? Powtarzam nie chcę gotowego problemu tylko pomocy jakiej funkcji z jakiej biblioteki użyć.

Pozdrawiam i przepraszam za niejasnosć.

0

Dzięki za podpowiedź:) Biorę się do roboty, tylko najpierw muszę trochę poczytać o wskaźnikach, łańcuchach i funkcjach znakowych.
Pozdrawiam.

0

Dzięki za podpowiedź:) Biorę się do roboty, tylko najpierw muszę trochę poczytać o wskaźnikach, łańcuchach i funkcjach znakowych.
Pozdrawiam.

edit: sorry za zdublowanie postów

0

Można też tak:

#include <iostream>
#include <sstream>

using namespace std;

int main()
{
  // ustawienie formatu wyswietlania liczb
  cout.setf(ios::fixed);
  cout.setf(ios::showpoint);
  cout.precision(4);

  string linia;
  while (getline(cin,linia))
    {
      istringstream slinia(linia);
      string wiersz;
      cout << "Macierz:\n";
      while (getline(slinia,wiersz,'#'))
        {
          istringstream swiersz(wiersz);
          bool pierwszy = true;
          float liczba;
          cout << "[";
          while (swiersz >> liczba)
            {
              if (pierwszy)
                {
                  pierwszy = false;
                }
              else
                {
                  cout << ", ";
                }
              cout << liczba;
            }
          cout << "]\n";
        }
    }
  return 0;
}

Przykład użycia:
Wejście:
123.4 133 2323 # 121212 33232 11 2 3 2
Wynik:

Macierz:
[123.4000, 133.0000, 2323.0000]
[121212.0000, 33232.0000, 11.0000, 2.0000, 3.0000, 2.0000]

Wejście:

123 # 13 # 2 1
1 # 1 # 1

Wynik:

Macierz:
[123.0000]
[13.0000]
[2.0000, 1.0000]
Macierz:
[1.0000]
[1.0000]
[1.0000]
0

Dzięki krwq, ale niestety nie łapię C++, a program muszę napisać w C:( Zaraz go trochę przeanalizuję, a tu jest to co mi się udało sklecić:

#include <stdio.h>

int main()
{
	int i = 0, j = 0, licznik_i = 0, licznik_i1 = 0, licznik_j = 5, licznik_j1 = 0, k, l;
	static int tab[4][4];
	
	while (i <= 4)
	{
		printf("Podaj %d wiersz\n", i+1);
		while (j < licznik_j && scanf("%d", &tab[i][j]) == 1)
		{
			if (i == 0)
				licznik_j1++;
			j++;
			licznik_i1++;
		}
		while(getchar() != '\n')
			continue;
		j = 0;
		licznik_j = licznik_j1 - 1;
		i++;
		if (licznik_i1 == 0)
			break;
		licznik_i1 = 0;
		licznik_i++;
	}
	printf("licznik i = %d, licznik j = %d\n", licznik_i, licznik_j);
	for (k = 0; k < licznik_i; k++)
	{
		for (l = 0; l <= licznik_j; l++)
			printf("%d ", tab[k][l]);
		printf("\n");
	}
	return 0;
}
 

tylko nie wiem czemu gdy wpiszę do macierzy dane:

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

To program daje następujący wynik:

1 2 3 4 6
6 7 8 9 11
11 12 13 14 16
16 17 18 19 21
21 22 23 24 25

Ma ktoś pomysł co napisałem źle i jak to przekształcić, żeby działało tak jak u krwq, bo u mnie zawsze trzeba zatwierdzać enterem? Nie mam pojęcia jak to zrobić, żeby przechodziło do kolejnego wiersza macierzy po wpisaniu #.

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