Terminazione nulle del char array



Answers

Come già sottolineato, devi definire / allocare un array di lunghezza N + 1 per poter memorizzare correttamente N caratteri. È possibile limitare la quantità di caratteri letti da scanf. Nel tuo esempio sarebbe:

scanf("%4s", A);

per leggere max. 4 caratteri da stdin.

Question

Considera il seguente caso:

#include<stdio.h>
int main()
{
    char A[5];
    scanf("%s",A);
    printf("%s",A);
}

La mia domanda è se char A[5] contiene solo due caratteri. Dì "ab", quindi A[0]='a' , A[1]='b' e A[2]='\0' . Ma se l'input è dire "abcde" allora dove è '\0' in quel caso. A[5] contiene '\0' ? Se sì, perché? sizeof(A) restituirà sempre 5 come risposta. Quindi quando l'array è pieno, c'è un byte extra riservato a '\0' che sizeof() non conta?




\ 0 è un operatore di terminazione che termina quando l'array è pieno se l'array non è pieno allora \ 0 sarà alla fine dell'array quando si inserisce una stringa che leggerà dalla fine dell'array




Finirai con un comportamento indefinito .

Come dici tu, la dimensione di A sarà sempre 5, quindi se leggi 5 o più char , scanf proverà a scrivere in una memoria, che non dovrebbe modificare.

E no, non c'è spazio / carattere riservato per il simbolo \0 .




le matrici di caratteri in c sono solo indicatori di blocchi di memoria. Se dici al compilatore di riservare 5 byte per i caratteri, lo fa. Se si tenta di inserire più di 5 byte, si limiterà a sovrascrivere la memoria oltre i 5 byte prenotati.

Ecco perché c può avere implementazioni di sicurezza serie. Devi sapere che stai solo scrivendo 4 caratteri + a \ 0. C ti permetterà di sovrascrivere la memoria fino a quando il programma si blocca.

Per favore non pensare a char foo [5] come a una stringa. Pensalo come un posto dove mettere 5 byte. È possibile memorizzare 5 caratteri senza un valore nullo, ma è necessario ricordare che è necessario eseguire una memcpy (otherCharArray, foo, 5) e non utilizzare strcpy. Devi anche sapere che l'altroCharArray ha spazio sufficiente per quei 5 byte.




Links



Tags

c   null   char