как да проверите дали масивът char е празен


Отговор 1:

Както обяснява отговорът на Дейвид - важно е да разграничите дали проверявате стойности в масив или дали етикетът е разпределил съхранение.

Трябва да имате място за съхранение, за да съхранявате каквото и да било. Звучи тъпо и кръгло, но повярвайте ми, че е грешка номер 1 за начинаещи в C и C ++, за да се опитате да поставите стойности в променлива, без да отделяте достатъчно (или каквото и да е) място в паметта за обектите, които се опитвате да поставите.

По-голямата част от времето в проектирането на C ++, ако откриете, че вече не знаете дали променливата на масив char носи съхранение или е просто нулев указател, вече имате проблеми с вашия дизайн. Наследственият C код доста се заблуждава със C низове и отново е основен източник на грешки и грешки, като C низовете са само празни указатели или нямат достатъчно памет за съхранение на данните, които се добавят към тях.

C ++ обикновено е по-безопасно в това отношение, но ако се използват същите техники, които създават проблеми на програмистите на C, тогава ще възникнат същите проблеми.

Така че трябва да направите както проверка на нулев указател, така и преглед на кода, за да сте сигурни, че е масив char

  • не е nullptr
  • има достатъчно разпределена памет
  • ако низ в стил С, има поне 1 допълнителен байт за съхранение
  • ако низ в стил С, след последната буква има NULCHAR ('\ 0').

Дори и днес C низът функционира в може да срине програмата, ако ги извикате с нулев символен знак. strlen () е особено неприятен, тъй като при сегментирането се проваля на нулев указател (през 2019 г.!), въпреки че цялата му цел е да проверява дължините на низовете. Той също така връща броя на буквите преди NULCHAR, а не размера на хранилището.


Масивът char ще има ненулев адрес. Ако това е само показалец char, той ще има или адрес 0 (нулев указател), или ще бъде неинициализиран, или ще има адреса на масив char.

Ако е неинициализиран, тогава е опасно, докато вие като автор не се уверите, че го присвоявате или на nullptr, или на адреса на разпределен масив. След това зависи от вас да запазите размера на масива, ръчно и през целия живот на масива. Не приемайте колко е дълъг низ, освен ако сами не зададете дължината или тя е видима в източника.

char a [] = "това е низ"; // 16 букви, 1 NULCHAR = 17 байтаchar * b; // няма съхранениеchar * c = "и това е низ." // само за четене 23 + 1 = 24char d [22]; // 22 неинициализираниchar e [22] (); // 22 инициализирани в '\ 0'char * низ_функция (char * s); // лоша идеяchar * низ_функция (char * s. size_t n); // С стилchar * низ_функция (char s [], size_t n); // С ++ стил// C ++ гарантирано статично съхранение// връщане на s след извършване на работа с него.char * низ_функция (char [100] & s); // C ++ гарантирано динамично съхранениеchar * низ_функция (нов char s [100] ()); // върнете s след като сте работили с него, изтрийте го по-късно.

Могат да се правят различни проверки, но отново твърдя, че ако сте точката, в която не сте сигурни какъв показалец имате, трябва да направите резервно копие и да се уверите какво е това и колко място за съхранение съдържа, преди да е необходимо проверете го в някаква функция.

В работата на системите това е толкова важно, че прекарвате необикновено много време в проверка на състоянието на грешките на функциите, преди дори да се притеснявате за данните, които те генерират, за да се предотврати разпространението на лоши указатели, пренасочване на нулев указател и писане на недостатъчно съхранение (превишаване на буфера).

Няма един прост начин, освен по трудния начин, ръчно изливане на код, проверка на грешките, когато се появят, и изучаване на всички начини за прецакване и приемане в крачка, че няма безплатен обяд. Трябва да свършите работата, като прегледате кода и проследите какво е пропуснато, какво идва от какво, като изследвате обичайно напълно безинтересните временни стойности, които никой не иска да гледа.


Отговор 2:

Терминът „null” в C ++ се използва предимно wrt. специална стойност за указатели и указател към членове, но се използва и в „нулев символ“. Понякога съм чувал термина, използван като синоним на „нулева стойност“, но за конкретния случай на „масив от знаци“, който все още не е супер ясен, тъй като такива масиви формират основата на традиционните C низове.

Ако просто искате да проверите дали всички елементи в масива са нула, можете просто да използвате алгоритъма std :: all_of:

#include bool char_array_is_zero (масив char [], std :: ptrdiff_t дължина) { върнете std :: all_of (масив, масив + дължина,[] (char x) {return x == '\ 0'; });}

Ако обаче знаете, че масивът наистина е символен низ в стил С, който е байтова последователност, завършваща с нула (NTBS), тогава може би условието, което търсите, е просто масив [0] == '\ 0' ? Това проверява дали даден масив представлява празен низ (т.е. първият знак вече прекратява низа).

И накрая (и може би най-вероятно?), Това, което наистина имате, може да е указател към първия елемент на масив и в този случай може би условието, което можете да тествате, ще бъде ptr == nullptr (т.е. указателят не посочете нещо). Има и други начини за изразяване на този тест, включително само "! Ptr", но предпочетох да напиша сравнението изцяло.


Отговор 3:

Въпросът ви не е напълно ясен, но ако искате да проверите дали масив MyArray от масив (представляващ низ, т.е. текст?) Е или неопределен, или празен, аз го правя

if (! MyArray ||! * MyArray) // Масивът изобщо не съществува или е празен

Първият тест проверява дали MyArray не е дефиниран, т.е. дори не е разпределен (той изобщо не съществува). Ако (и само ако) това не е така (т.е. дефиниран е масивът), вторият тест проверява дали в символа няма символи.


Отговор 4:

Това ще работи, за да открие дали масивът от символи е празен. Вероятно е и най-бързият.

ако (текст [0] == '\ 0') {}

Това също ще бъде бързо, ако текстовият масив е празен. Ако съдържа символи, първо трябва да преброи всички символи в него.

ако (strlen (текст) == 0) {}

чрез: stackoverflow


Отговор 6:

int p; за (p = 0; a [p ++] == '\ 0';);

int IsAllZeroes = p> = sizeof (a);