kako provjeriti je li niz znakova prazan


Odgovor 1:

Kao što objašnjava Davidov odgovor - važno je razlikovati provjeravate li vrijednosti u nizu ili provjeravate je li oznaka dodijelila pohranu.

Morate imati spremište da biste bilo što spremili. Zvuči glupo i kružno, ali vjerujte mi da je početnička pogreška broj jedan u C i C ++ pokušati staviti vrijednosti u varijablu bez izdvajanja dovoljno (ili bilo kojeg) memorijskog prostora za objekte koje pokušavate staviti.

Većinu vremena u dizajniranju C ++ ako otkrijete da već ne znate nosi li varijabla niza char memoriju ili je samo nulti pokazivač, već imate problema sa svojim dizajnom. Naslijeđeni C kôd puno se zavarava sa C žicama i opet je glavni izvor pogrešaka i grešaka, s tim što su C nizovi samo prazni pokazivači ili nemaju dovoljno memorije za čuvanje podataka koji su im dodani.

C ++ je općenito sigurniji u tom pogledu, ali ako se koriste iste tehnike koje C programere dovode u problem, rezultirat će istim problemima.

Dakle, morate obaviti provjere null pokazivača i pregled koda kako biste bili sigurni da je polje char

  • nije nullptr
  • ima dovoljno dodijeljene memorije
  • ako niz u stilu C ima najmanje 1 dodatni bajt memorije
  • ako je niz u stilu C, iza zadnjeg slova nalazi se NULCHAR ('\ 0').

Čak i danas, C niz funkcionira u može srušiti program ako ih pozovete na null char pokazivaču. strlen () je posebno gadan, jer segmentira greške na null pokazivaču (2019. godine!), iako mu je cijela svrha provjeriti duljinu niza. Također vraća broj slova prije NULCHAR, a ne veličinu pohrane.


Polje char imat će adresu koja nije nula. Ako je to samo pokazivač char, on će imati ili 0 adresu (null pokazivač), ili će biti neinicijaliziran, ili će imati adresu niza char.

Ako se neinicijalizira, tada je opasno dok ga kao autor ne osigurate da ga dodijelite ili nullptr ili adresi dodijeljenog niza. Tada je na vama da zadržite veličinu niza, ručno i za cijeli životni vijek niza. Ne pretpostavljajte koliko je niz dugačak, osim ako sami odredite duljinu ili je ona očito vidljiva u izvoru.

char a [] = "ovo je niz"; // 16 slova, 1 NULCHAR = 17 bajtovachar * b; // nema spremištachar * c = "i ovo je niz." // samo za čitanje 23 + 1 = 24char d [22]; // 22 neincijaliziranochar e [22] (); // 22 inicijalizirano u '\ 0'char * funkcija_niza (char * s); // Loša idejachar * funkcija_niza (char * s. size_t n); // C stilchar * funkcija_niza (char s [], size_t n); // C ++ stil// C ++ zajamčena statička pohrana// return s nakon odrađenog posla s tim.char * string_function (char [100] & s); // C ++ zajamčena dinamička pohranachar * string_function (novi char s [100] ()); // vrati s nakon obavljenog posla, izbriši ga kasnije.

Mogu se izvršiti razne provjere, ali opet tvrdim da ako ste točka u kojoj niste sigurni kakav pokazivač imate, morate napraviti sigurnosnu kopiju i provjeriti što je to i koliko prostora za pohranu sadrži prije nego što to trebate provjeri u nekoj funkciji.

U radu sustava to je toliko važno da trošite neumjereno puno vremena provjeravajući status pogrešaka funkcija prije nego što se i brinete o podacima koje proizvode, kako bi se spriječilo širenje loših pokazivača, preusmjeravanje null pokazivača i pisanje na nedovoljno pohrana (prekoračenje međuspremnika).

Ne postoji jedan jednostavan način, osim na teži način, ručno prelijevanje koda, provjeravanje pogrešaka kad se pojave i učenje svih načina zajebanja i polako uzimanje u obzir da nema besplatnog ručka. Morate obaviti posao pregledavanja koda i traženja propuštenog, što iz čega proizlazi, proučavanjem uobičajeno totalno nezanimljivih privremenih vrijednosti koje nitko ne želi pogledati.


Odgovor 2:

Izraz "null" u C ++-u uglavnom se koristi wrt. posebna vrijednost za pokazivače i pokazivače na članove, ali također se koristi u "null znaku". Povremeno sam čuo izraz koji se koristi kao sinonim za "nultu vrijednost", ali za specifični slučaj "char char" koji još uvijek nije super jasan, jer takvi nizovi čine osnovu tradicionalnih C žica.

Ako samo želite provjeriti jesu li svi elementi u polju nula, možete jednostavno koristiti algoritam std :: all_of:

#include bool char_array_is_zero (niz polja char [], std :: ptrdiff_t length) { vrati std :: all_of (niz, niz + duljina,[] (char x) {return x == '\ 0'; });}

Međutim, ako znate da je niz doista niz znakova u stilu C, koji je nule završena sekvenca bajtova (NTBS), tada je uvjet koji tražite jednostavno niz [0] == '\ 0' ? To testira predstavlja li zadani niz prazan niz (tj. Prvi znak već završava niz).

Napokon (i možda najvjerojatnije?), Ono što stvarno imate može biti pokazivač na prvi element niza, a u tom slučaju možda bi uvjet koji biste mogli testirati bio ptr == nullptr (tj. Pokazivač ne ukazati na bilo što). Postoje i drugi načini izražavanja tog testa, uključujući samo "! Ptr", ali radije sam usporedbu napisao u cijelosti.


Odgovor 3:

Vaše pitanje nije potpuno jasno, ali ako želite provjeriti je li niz znakova MyArray (koji predstavlja niz, tj. Tekst?) Nedefiniran ili prazan, znam

if (! MyArray ||! * MyArray) // Niz uopće ne postoji ili je prazan

Prvi test provjerava je li MyArray nedefiniran, tj. Nije niti dodijeljen (jednostavno uopće ne postoji). Ako (i samo ako) to nije slučaj (tj. Niz je definiran), drugi test provjerava nema li znakova u nizu.


Odgovor 4:

Ovo će uspjeti pronaći ako je niz znakova prazan. Vjerojatno je i najbrži.

ako (tekst [0] == '\ 0') {}

To će također biti brzo ako je polje s tekstom prazno. Ako sadrži znakove, prvo mora prebrojati sve znakove u njemu.

ako (strlen (tekst) == 0) {}

putem: stackoverflow


Odgovor 5:

Pogledajte ovu raspravu ovdje:

brz način provjere je li niz znakova nula

Odgovor 6:

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

int IsAllZeroes = p> = veličina (a);