Wielowymiarowa tablica ciągów znaków

0

Witam,
Mam problem i proszę o jakieś wskazówki. Tworzę aktualnie grę, w której chciałbym zastosować różne wersje językowe. Chciałbym je przechowywać w tablicy, której pierwszy indeks odpowiadałby danemu językowi (np. 0 - polski, 1 - angielski), a drugi - danemu ciągowi znaków. Przy czym ciąg znaków miałby maksymalnie np. 30 znaków. Przykład takiego "pseudokodu":

lang[0][1] = 'Nowa gra';
lang[1][1] = 'New game';

To jest pewnie proste, ale niestety jakoś nie mogę wpaść na rozwiązanie. Myślałem o dwóch opcjach - albo trójwymiarowa tablica ciągów znaków, bo ciągi znaków to po prostu tablica char'ów.

Albo druga opcja - zastosowanie dwuwymiarowej tablicy stringów. Ale to już chyba wykracza poza granice języka C.

Tak więc, proszę o wskazówki.

0
const char *Tb[][2]=
  {
   {"Nowa gra","New game"},
   {"Bardzo długi wiersz który sobie wstukasz","Very long string just inputed by You"}
  };

Ale to nie jest dobry sposób.

0

Ten sposób jest działający, ale to już trudniej "obliczyć", który element ma jaki indeks.
Z drugiej strony łatwiej tutaj wprowadzać dane do tej tablicy. Bo z racji ograniczenia liczby znaków do np. 40, nie mogę już po inicjalizacji tablicy sobie tam wpisać ciągu znaków o długości 10, tylko musiałbym korzystać z strcpy.
Ale w takim wypadku jak najlepiej przechowywać dane o wersjach językowych? Docelowo miałem zapisywać je w plikach tekstowych, z których bym je potem odczytywał, ale do tego i tak potrzebuję strukturę.

Ewentualnie teraz przyszło mi do głowy zastosowanie struktur dynamicznych - przy odczycie danych z pliku lądowałyby one na np. liście dwukierunkowej. Ale potem utrudniony jest odczyt danych - bo trzeba jednak odszukać wymagany element...

0
const char *Tb[100][2];
Tb[0][0]="Nowa gra";
Tb[1][0]="Bardzo długi wiersz który sobie wstukasz";

Zrób specjalny edytor i trzymaj napisy w odpowiednich plikach tekstowych lub binarnych.

0

Mam jeszcze jedno pytanie. Jak wygląda sprawa z polskimi znakami? Bo wczytując je z pliku tekstowego (UTF8) w konsoli mam krzaki...

0

Tak więc chodzi o znaki diakrytyczne takie jak ĄĆĘŁŃÓŚŻŹ.
System to Win 7 64bit, kompilator to GCC, a IDE to Code::Blocks 12.11.

Mam przykładowy plik tekstowy:

Nowa gra
wznów
ąśżćńćśół

A kod odczytujący po linijce ten plik:

    FILE *polski;
    polski= fopen("polski.jez","r");
    if(polski== NULL)
    {
    printf("Blad!\n");
    }
    char napis[50], *result;
    fgets(napis,50,polski);
    printf("Ciag: %s\n",napis);
    fgets(napis,50,polski);
    printf("Ciag: %s\n",napis);
    fclose(polski);

Nie bawiłem się teraz już w pętlę, tylko do testów dwie linijki chciałem odczytać.
Zakładam, że każdy język jest w osobnym pliku.

0

Dziękuję za pomoc. Zobaczę to za jakąś chwilkę.
Mam jeszcze jedno pytanie. W Allegro 5 napisy z "ąśćź" i innymi tego typu znakami wyświetlają mi się poprawnie. Źle wyświetla mi się jedynie w konsoli, to mogę przełknąć ;)

    for(i = 0; i<3; i++)
    {
        fgets(napis,50,LangPolish);
        printf("napis: %s\n",napis);
        lang[i][0]=napis;
    }

Mam taką pętlę, która te trzy linijki ma mi odczytać.
Mam tablicę lang, gdzie mam przechowywać teksty.

char *lang[100][2];

I tutaj mam mały problem, gdyż się pogubiłem ze wskaźnikami. Wszystkie elementy tablicy wskazują mi na jeden tekst - ten wczytany na końcu...

0

Zakładam, że każdy język jest w osobnym pliku.

Zaraz zaraz, teraz to zmieniasz zeznania. Jaki „każdy język”? Bo wychodzi że potrzebne ci nie tylko polskie litery, co obsługa Unicode'u w ogólności.
Pytanie więc, w jakim zakresie?

każdy z poniższych języków stanowi inny poziom trudności w zaimplementowaniu:

  • niemiecki
  • rosyjski
  • chiński
  • hebrajski
  • tajski
  • hieroglify egipskie
0

Każdy język tzn. polski i angielski ;)

1
#include <stdio.h>
#include <windows.h>

int Utf8ToOem(const char *utf8str, char *oemstr, size_t oemlen)
{
	int len = MultiByteToWideChar(CP_UTF8, 0, utf8str, -1, NULL, 0);
	wchar_t utf16str[len];
	MultiByteToWideChar(CP_UTF8, 0, utf8str, -1, utf16str, len);
	return WideCharToMultiByte(CP_OEMCP, 0, utf16str, len, oemstr, oemlen, NULL, NULL);
}

int main()
{
    FILE *polski;
    polski= fopen("polski.jez","r");
    if(polski== NULL)
    {
    printf("Blad!\n");
    }
    char napis[50], *result;
    char napis_oem[50];

    fgets(napis, sizeof(napis), polski);
    Utf8ToOem(napis, napis_oem, sizeof(napis_oem));
    printf("Ciag: %s\n",napis_oem);

    fgets(napis, sizeof(napis), polski);
    Utf8ToOem(napis, napis_oem, sizeof(napis_oem));
    printf("Ciag: %s\n",napis_oem);

    fclose(polski);
}

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