Problem z tablicą typu char

0

Witam. Piszę pierwszego posta na tym forum.
Mam problem odnośnie do tablicy typu char.

O to kod:

 
#include <conio.h>
#include <string.h>

using namespace std;

const int MAX_NUMBERS = 9;

struct PersonalData {
       private:
               char name[20];
               int number[MAX_NUMBERS];
               bool winner;
       

       
       public:
              int setNumber() {
                  char znak;
                  int i=0;

                  do {
                      znak = getch();
                      if(znak >= 48 && znak <= 57){
                         printf("%c", znak);
                         number[i] = znak;
                      } else
                           i--;
                      i++;
                  } while(i != MAX_NUMBERS);
                          
                  cout<<"\n";
                  return 0;
              };
              
              char setName() {
                     char znak;
                     int i=0;    
                                      
                     do {
                         znak = getch();
                         if(znak >= 97 && znak <= 122) {
                                 printf("%c", znak);
                                 name[i] = znak;
                         } else
                                 i--;
                         i++;
                     } while(znak != 13 && znak != 27);
                     return 0;
              };

       public:       
              void getNumber() {
                  for(int i=0; i<MAX_NUMBERS; i++)
                      printf("%c", number[i]);
              };
                                  
              
              void getName() {
                  for(int i=0; i<strlen(name); i++) {
               
                            printf("%c", name[i]);
                  }
              };
};
 
#include <iostream>
#include "PersonalData.h"
#include "Display.h"

using namespace std;

int main()
{
    struct PersonalData personalData[1];
    
    personalData[1].setName();
    personalData[1].getName();

   personalData[1].setNumber();
   personalData[1].getNumber();
}

Gdy wpisuję imię jest wszystko w porządku natomiast gdy mam wyświetlić wychodzi mi imię i dodatkowo jakieś śmieci(nie zawsze ale w większości przypadków).
Dla trybu numerycznego nie ma takiego problemu.

Np:
Wpisuję imię: Janek
Wypisuje mi: Janek>**&#@ (czasem jest w porządku i nie wyświetla śmieci.)

Wpisuję numer: 123456789
Wypisuje mi:  123456789

Dla numeru jest okey a dla tekstu pojawia się ten problem.

Nie wiem w ogóle jak go rozwiązać. Czemu wyświetla mi śmieci jak jest zastosowana funkcja strlen?

Próbowałem rozwiązania takiego:

 
              void getName() {
                  for(int i=0; i<strlen(name); i++) {
                       if(name[i] >= 97 && name[i] <= 122)
                            printf("%c", name[i]);
                  }
              };

Ale tutaj może zdarzyć się że śmieć będzie np literą n,a,b,s,y,p.

0

Nie sprawdzasz ile znaków wprowadzono, a tablicę masz o określonym rozmiarze.
Ciągi znaków w C winny być zakończone znakiem '\0' oznaczającym koniec łańcucha. Ty go nie wstawiasz, więc printuje Ci zawartość pamięci za tablicą, aż do najbliższego bajtu zerowego. Albo wstawiaj ręcznie '\0' na końcu łańcucha, albo najpierw wyzeruj tablicę, albo użyj string skoro piszesz w C++.

0

A gdzie dodajesz '\0' na koniec c-stringa?
edit: I zastosuj się do rad wyżej. Dziwne, że w ogóle się bawisz w takie rzeczy w programie konsolowym. A co gdybym chciał go użyć w nieco inny sposób, czyli z przekierowaniem pliku z danymi na program? ;)

0

Ja się tutaj bawię pod przymusem:p W szkole zadali program i trzeba go zrealizować.
Dzięki za rady. Zaraz postaram się przystosować wasze sugestie.

A znak '\0' wstawić po wprowadzaniu znaków do tablicy na sztywno? Tzn. zadeklarować name[i+1] = '\n';

0
Fluke napisał(a)

Ja się tutaj bawię pod przymusem:p W szkole zadali program i trzeba go zrealizować.
Dzięki za rady. Zaraz postaram się przystosować wasze sugestie.

Łączylibyśmy się w bólu, gdyby programowanie nie było takim funem.

Fluke napisał(a)

A znak '\0' wstawić po wprowadzaniu znaków do tablicy na sztywno? Tzn. zadeklarować name[i+1] = '\n';

Nie. Znakiem powinno być '\0', nie '\n' (to dwa różne znaki). Reszta się zgadza.
I jeszcze raz: NIE SPRAWDZASZ ILOŚCI WPROWADZONYCH ZNAKÓW! Jeśli ktoś wpisze więcej niż 20 znaków, zaczniesz pisać poza tablicą i albo będziesz nadpisywał inne struktury, albo wyjdziesz poza "swoją pamięć" i dostaniesz SEGFAULT. Powinieneś przypilnować żeby nie dało się wprowadzić więcej niż 19 znaków (dwudziesty to '\0').
Jeśli możesz, użyj string. Jeśli nie możesz, to zwracaj większą uwagę.

0

@Kumashiro

Wiem, dzięki :)

A jeśli chodzi o programowanie w C/C++ jestem anty fanem, natomiast PHP, JAVA ogromnym :)

Tylko OOP!!!

Dzięki wielkie i pozdrawiam:)

0

A, to pewnie dlatego u Ciebie metoda w klasie jest interaktywna (gada z userem) - przyzwyczajenie z Javy, gdzie wszystko jest klasą. Zazwyczaj z userem się gada w głównym bloku, ewentualnie w jakichś specjalnych funkcjach, a do klas jedynie przekazuje pobrane dane. No, ale co komu wygodnie. Nie ma co tu gadać o religii :)

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