Vad är skillnaden mellan en karaktärsuppsättning och en c-sträng?


Svar 1:

En matris med kol är ett sammanhängande minnesintervall som analyseras som 8 bitars byte.Det är fixerat i storlek vid skapandet och garanteras att lagra en kol i varje byte.

En kol i detta fall är vilken som helst 8-bitars binär siffra från00000000 (0x00 hex) till 11111111 (0xFF hex).

char array [100]; / * 100 chars array [0] to array [99] * /

En C-sträng använder ett char array för lagring. En C-sträng kan vara från 0 till längden på matrisen minus 1 tecken lång.

För att vara välformad kan matrisen endast innehålla en deluppsättning av byte som representerar giltiga symboler i den teckenuppsättning som ska användas. Ofta är detta ASCII eller UTF-8. Alla andra byte kanske inte är giltiga vid utskrift eller tolkning av strängen.

Strängen kommer att ha en etikett (variabel) som är en teckenpekare (char *) -typ som innehåller adress för matrisen.

Strängen kommer att ha en NULCHAR, ('\ 0', 0x00 hex) som avslutar strängen efter strängets sista tecken.

char s [10]; char * t = & s; strncpy (t, "012345678 \ 0", 10)

En "omedelbar sträng" skrivs med dubbla citat i källkoden och gör att en karray-grupp med de fyllda karterna skapas och placeras i en speciell strängskyddad minnesplats och en pekare till den returneras. Detta är "syntax socker" av kompilatorn och gör det enkelt att använda sådana strängar. En NULCHAR läggs automatiskt till arrayen för att göra den till en välformad sträng.

char * s = "en omedelbar sträng"; printf ("% s \ n), s);

Alla standard C-bibliotekssträngfunktioner passerar strängar som char * och förlitar sig på att '\ 0' är närvarande.

En "hack" som används ganska universellt är att etiketten för en matris när den öppnas fungerar som en pekare till det första elementet i matrisen. och vice versa.

char * x = "abcdefgh"; printf ("x fjärde karaktär:% c \ n", x [3]); x 4: e char: d / * lägg en sträng i en char array * / char str [100]; strncpy (str, "abcdefghijklmnop \ 0", 18); char * a = str; char * b = str + 7; printf ("% s \ n", a); abcdefghijklmnop printf ("% s \ n", b); hijklmnop

Trots denna flexibilitet är en char array och en C-sträng inte direkt kompatibla.

char s [10]; s = "abcdefghi"; / * error * / // error: inkompatibla typer vid tilldelning för att skriva 'char [10]' från typ 'char *' "abcdefghi" är en omedelbar sträng och löser en pekare till 'a' i den grupp som skapats för den. Att tilldela s till det fungerar inte, eftersom char arrays inte kan tilldelas.

Matriser är inte riktigt en förstklassig typ i C. De kan inte kopieras direkt, de har inga funktioner på matrisnivå, etc. Allt som görs med matriser i C görs på det enskilda innehållet, inte som en enhet.

char s [10]; char * x = "abcdefghi"; / * '\ 0' är i slutet * / strncpy (s, x, 10); / * kopierar varje char till array * /

Svar 2:

En teckenuppsättning är en datastruktur i programmeringsspråket C: ett antal byte i minnet där du kan lagra tecken. Du kan lagra valfritt tecken (dvs. byte på 8 bitar, värde 0 till 255) i var och en av dessa celler.

En C-stilsträng (som vad jag tolkar "c-sträng" i din fråga till betyder) är ett sätt att representera en "sträng" av tecken, definierat av C-språket som ett antal tecken utan nollbyten (värde 0). Detta representeras av själva karaktärerna följt av en nollbyte, så att det inte finns något behov att lagra strängens längd separat. Kontrast detta med Pascal-strängen, där den representeras av ett 16-bitars osignerat heltal följt av det antalet byte information (så att Pascal-strängens längd är högst 65535).

Så teckenuppsättning är en datastruktur, C-stilsträng är datarepresentation. De är olika djur.

En teckenuppsättning kan innehålla en sträng i C-stil, eller den kan innehålla något annat (t.ex. den innehåller användbar information efter nolltecknet, eller innehåller inget nolltecken alls); och ändå kanske du kan tolka den som en C-stilsträng ändå (så länge den innehåller minst ett nulltecken). En C-stilsträng kan lagras i en teckenuppsättning, eller den kan lagras i någonstans inte i en matris (t.ex. en skrivskyddad del av minnet och kan därför inte "lagra" andra värden).