2013-08-23 13 views
40

Obecnie piszę trochę program, ale wciąż otrzymuję ten błąd podczas kompilacjiJak przedstawia się pusty znak?

error: empty character constant

Zdaję sobie sprawę, że to dlatego, że staram się zastąpić ważny char z pustej przestrzeni c[i]='' ale nie udało się znaleźć inny sposób reprezentowania go.

+0

nie ma "pusta przestrzeń" (źle terminologię), chociaż może być pustym ciągiem. Czy chcesz zamienić 'c [i]' na * pustą przestrzeń *, czy też chcesz "wyeliminować" ten znak z tablicy, tak jak zrobiłbyś to w edytorze, gdy naciśniesz backspace (np. Czy chcesz znaki c [i-1] i c [i + 1] stają się sąsiadami po operacji)? –

+0

Jeśli rozumiesz łańcuchy znaków, to w momencie deklaracji możesz przypisać [char char [5] = ""; '] (http://stackoverflow.com/questions/17790127/what-is-meant-by-char -temp3/17790207 # 17790207) pusty łańcuch, ale "char c ="; "nie jest ważny, jak poniżej wyjaśniono w 6 odpowiedziach. –

Odpowiedz

69

Możesz użyć c[i]= '\0' lub po prostu c[i] = (char) 0.

NULL/pusty znak jest po prostu wartością zero, ale może być również reprezentowany jako znak z zbiegiem zero.

+7

Tak, i nie ma "pustego char". '' \ 0'' jest * pustym znakiem *, który nie ma nic wspólnego z 'NULL'; null char jest po prostu char z 0 jako kodem numerycznym. –

+0

@ LorenzoDonati Odniosłem się do tego jako pusty znak, pusty znak był po prostu używać terminologii OP. Wyjaśniłem to również w mojej edycji. Jak zauważa chux, NULL nie jest zbyt dobre dla ofert referencyjnych niezwiązanych ze wskaźnikami, więc również zrobiłem tę notatkę. – ardent

+0

Ok, przepraszam, nie widziałem ostatniej edycji. Nadal wzmianka o 'NULL' tutaj może być myląca IMHO: OP nie działa z' char ** ', ale z prostym' char [] 'i wydaje się całkiem nowicjuszem. –

9

Pustym znakiem spacji będzie ' '. Jeśli szukasz wartości null, będzie to '\0'.

7

Tak, c[i]='' nie jest prawidłowym kodem. Stała znakowa nawiasu między '', np. c[i] = 'A'; char A. ale nie piszemy żadnego znaku między ''.

Pusta przestrzeń jest niczym innym, jak przypuszczam, jeśli chce przypisanej przestrzeni wtedy zrobić:

c[i] = ' '; 
// ^space 

jeśli chce przypisany nul char wtedy zrobić:

c[i] = '\0'; 
//  ^null symbol 

Przykład: Załóżmy, że jeśli c[] string (nul \0 zakończona tablica znaków), jeśli masz ciąg znaków. na przykład:

char c[10] = {'a', '2', 'c', '\0'}; 

I Ci zastąpić drugą char z miejsca:

c[1] = ' '; 

a jeśli wydrukować go za pomocą printf następująco:

printf("\n c: %s", c); 

wtedy wyjście będzie:

c: a c 
// ^space printed 

I zastąpić drugą char z '\ 0':

c[1] = '\0'; 

wtedy wyjście będzie:

c: a 

ponieważ łańcuch zakończony \0.

11

Nie można zapisać "znaku" w postaci - nie ma to sensu.

Jako alternatywę możesz zapisać znak, który ma dla ciebie szczególne znaczenie - np. null char '\0' - i traktuj to specjalnie.

+2

Myślę, że jest to o wiele lepsza odpowiedź niż zaakceptowana, co dezorientuje wartość null char i empty char. Analogicznie, to tak, jakby powiedzieć, że nie możesz zadeklarować int i zapisać "no number" - musisz przechowywać _some_ value. – simonwo

+0

Możesz mieć łańcuch pusty "" ", ponieważ łańcuch jest sekwencją zero lub więcej znaków, ale znak jest dokładnie jedną wartością - nie zero i nie więcej. – simonwo

4

Do reprezentowania fakt, że wartość nie jest obecna masz dwie możliwości:

1) jeżeli cała char zakres ma sens i nie można zarezerwować dowolną wartość, a następnie użyj char* zamiast char:

char** c = new char*[N]; 
c[0] = NULL; // no character 
*c[1] = ' '; // ordinary character 
*c[2] = 'a'; // ordinary character 
*c[3] = '\0' // zero-code character 

Będziesz wtedy miał c[i] == NULL, gdy znak nie jest obecny, a poza nim *c[i] dla zwykłych znaków.

2) Jeśli nie potrzebujesz pewnych wartości, które można reprezentować w char, zastanów się, czy nie ma tam wartości, na przykład znak '\0'.

char* c = new char[N]; 
c[0] = '\0'; // no character 
c[1] = ' '; // ordinary character 
c[2] = 'a'; // ordinary character 

Wtedy będziesz mieć c[i] == '\0' dla kiedy postać nie jest obecny i zwykłych znaków inaczej.

+2

Pytanie jest oznaczone tagiem [c:], a nie [tag: C++] –

+0

@CoolGuy Dobra racja, masz rację. Punkt odpowiedzi pozostaje jednak nadal, abstrahując od sposobu alokacji pamięci. – BartoszKP

4

Nie ma czegoś takiego jak "pusty znak" ''.

Jeśli potrzebujesz znaku spacji, który może być reprezentowany jako spacja: c[i] = ' ' lub jako jego odpowiednik ósemkowy ASCII: c[i] = '\040'. Jeśli potrzebujesz znaku NUL, który jest c[i] = '\0'.

1

Przydałoby się przypisać wartość zerową w łańcuchu zamiast jawnie nadawać indeksowi pusty znak '\0'. Używałem tego do testowania funkcji, które obsługują łańcuchy, upewniając się, że mieszczą się w odpowiednich granicach.

Z:

char test_src[] = "fuu\0foo"; 

ta tworzy tablicę z wartościami wielkości 8:

{'f', 'u', 'u', '\0', 'f', 'o', 'o', '\0'} 
Powiązane problemy