2010-02-10 16 views
23

Pytanie jest w tytule, jak zainicjować char * [] i podać wartości w C++, dziękuję.Inicjowanie Char * []

+4

Dlaczego nie chcesz używać stl? jak w std :: vector ? –

+2

'... = {" cześć "," świat "}" nie działa? –

+1

ponieważ std :: vector jest odpadem, gdzie char * [] zrobi? –

Odpowiedz

17

Chociaż jesteś prawdopodobnie świadomy, char * [] jest tablicą wskaźników do postaci i domyślam się, że chcesz przechowywać pewną liczbę ciągów znaków. Inicjowanie tablicę takich wskaźników jest tak proste, jak:

char ** array = new char *[SIZE]; 

... lub jeśli przydzielania pamięci na stosie:

char * array[SIZE]; 

Będziesz wtedy prawdopodobnie chcesz, aby wypełnić tablicę z pętla takich jak:

for(unsigned int i = 0; i < SIZE; i++){ 
    // str is likely to be an array of characters 
    array[i] = str; 
} 

jak zauważył w komentarzach do tej odpowiedzi, jeśli alokowania tablicę z nowym (dynamiczny przydział) pamiętaj, aby usunąć tablicę z:

delete[] array; 
+1

' char ** array = new char [ROZMIAR]; 'powinno być' char ** array = new char * [ ROZMIAR]; ' – xian

+0

Tak więc powinno, dzięki za wskazanie :) –

+1

Możesz również przypomnieć, że jeśli tablica jest przydzielana dynamicznie, powinna zostać usunięta przy użyciu' delete [] array' (użycie 'delete array' jest błędem obecnego początkującego) . – kriss

1

Podobnie jak każdy inny tablicy:

char *a, *b, *c; 
char* cs[] = {a, b, c}; // initialized 
cs[0] = b; // assignment 
10

W zależności od tego, co chcesz, aby zainicjować można zrobić żadnej z:

char mystr[] = {'h','i',0}; 
char * myotherstring = "my other string"; 
char * mythirdstring = "goodbye"; 

char * myarr[] = {0}; 
char * myarr[] = {&mystr, myotherstring}; 
char * myarr[10]; 
char * myarr[10] = {0}; 
char * myarr[10] = {&mystr, myotherstring, mythirdstring, 0}; 

itp itd

+0

Czy '& mystr' i' & myotherstring' nie rozwiąże problemu typu char [] * ', który nie jest oczekiwanym' char * 'inicjatorem tablicy? – Romain

+0

Ja zredagowałem swoją odpowiedź nieco, a jak to jest teraz powinno działać. –

+0

Występuje również problem różnicy między char * i const char * Używam mojego kompilatora do zgłaszania ostrzeżenia za każdym razem, gdy próbuję przypisać const char * (ciągi stałe) do znaku *. – kriss

7

Jak to:

char* my_c_string; 
char* x[] = { "hello", "world", 0, my_c_string }; 
+0

To jest bardzo dobry przykład. 0 pomogłoby również w zakończeniu pętli, jeśli jakaś funkcja po prostu bierze argument jako void foo (char * x []) nie musisz mieć innej zmiennej, aby znaleźć długość tablicy. – siddhusingh

1
#include <iostream> 

int main(int argc, char *argv[]) 
{ 
    char **strings = new char *[2]; // create an array of two character pointers 
    strings[0] = "hello"; // set the first pointer in the array to "hello" 
    strings[1] = "world"; // set the second pointer in the array to "world" 

    // loop through the array and print whatever it points to out with a space 
    // after it 
    for (int i = 0; i < 2; ++i) { 
     std::cout << strings[i] << " "; 
    } 

    std::cout << std::endl; 

    return 0; 
} 
2

tak:

char p1 = 'A'; 
char p2 = 'B'; 
char * t[] = {&p1, &p2}; 

std::cout << "p1=" << *t[0] << ", p2=" << *t[1] << std::endl; 

Ale jakoś nie wierzę, że to odpowiedź na realną pytanie ...

cię chcesz mieć tablicę łańcuchów C zdefiniowanych podczas kompilacji, powinieneś użyć tablicy const char * zamiast:

const char * t2[] = {"string1", "string2"}; 

std::cout << "p1=" << t2[0] << ", p2=" << t2[1] << std::endl; 

Bez const mój kompilator powiedziałby: ostrzeżenie: przestarzałe konwersji z ciągiem stałym do „char *”

2

Jeśli naprawdę chcą tylko tablicę C stylu stałych ciągów (np indeksowane wiadomości):

const char* messages[] = 
{ 
    "Beginning", 
    "Working", 
    "Finishing", 
    "Done" 
}; 

Jeżeli jednak starasz się utrzymywać pojemnik uruchomieniowych ciągów zmiennych, używając C++ siłownia std::vector<std::string> uczyni śledzeniem wszystkich operacji pamięciowych znacznie łatwiejsze.

std::vector<std::string> strings; 
std::string my_string("Hello, world.") 
strings.push_back("String1"); 
strings.push_back(my_string); 
6

Jedna rzecz, którą zauważyłem, że musisz uważać na ... C i C++ nieco się rozdzieliły w składni inicjalizacji. Jak zaznacza Mark B. powyżej, można zainicjować tablicę znaków w następujący sposób:

const char* messages[] = 
{ 
    "Beginning", 
    "Working", 
    "Finishing", 
    "Done" 
}; 

Ale w C++. jak zauważy kriss, to wyświetla ostrzeżenie o przestarzałej konwersji z ciągu znaków na znak *. To dlatego, że C++ zakłada, że ​​będziesz chciał używać ciągów dla ciągów; -}.

To nie zawsze prawda. Więc jeśli naprawdę chcesz zainicjować tablicę char *, znalazłem, że muszę to zrobić tak:

const char* messages[] = 
{ 
    (char*)("Beginning"), 
    (char*)("Working"), 
    (char*)("Finishing"), 
    (char*)("Done") 
}; 

kompilator jest teraz szczęśliwy ...