Em um curso introdutório de C, aprendi que, ao armazenar, as seqüências de caracteres são armazenadas com caractere nulo \0
no final. Mas e se eu quisesse imprimir uma string, digamos, printf("hello")
embora tenha descoberto que isso não termina com a \0
seguinte declaração
printf("%d", printf("hello"));
Output: 5
mas isso parece ser inconsistente, até onde eu sei que variáveis como seqüências de caracteres são armazenadas na memória principal e, ao imprimir algo, elas também podem ser armazenadas na memória principal, então por que a diferença?
);
, o que você pretende mostrar com esse código? Como você provou que não termina com a\0
?Respostas:
O byte nulo marca o final de uma sequência. Não é contado no comprimento da sequência e não é impresso quando uma sequência é impressa
printf
. Basicamente, o byte nulo informa às funções que manipulam as strings quando parar.Onde você verá uma diferença é se você criar uma
char
matriz inicializada com uma string. O uso dosizeof
operador refletirá o tamanho da matriz, incluindo o byte nulo. Por exemplo:fonte
printf()
. TBH Eu não tenho idéia de comoprintf()
funciona.printf
retorna o número de caracteres impressos.'\0'
não é impresso - apenas sinaliza que não há mais caracteres nessa string. Também não é contado no comprimento da cordahttps://godbolt.org/z/wYn33e
fonte
Sua suposição está errada. Sua string realmente termina com um
\0
.Ele contém de 5 caracteres
h
,e
,l
,l
,o
e 0 caráter.O que a
print()
chamada "interna" gera é o número de caracteres que foram impressos, e são 5.fonte
Em C, todas as cadeias literais são realmente matrizes de caracteres, que incluem o terminador nulo.
No entanto, o terminador nulo não é contado no comprimento de uma sequência (literal ou não) e não é impresso. A impressão para quando o terminador nulo é encontrado.
fonte
printf
ela sairia dos limites da string e imprimiria caracteres "aleatórios" ou "lixo" e retornaria um número diferente do comprimento da string. Se você já conhece o comprimento da string, também pode verificar se o caractere nesse índice é'\0'
, o que funcionará, mas é um comportamento tecnicamente indefinido se o tamanho da matriz não incluir o terminador (como emchar arr[5] = "hello";
, que não adicionará o terminador para a matriz).char * p = "Hello"; int i = 0; while (p[i] != '\0') { printf("%d: %c", i, p[i]); i++; }
e ver como é executado: mostra linhas com índices e o conteúdo nessa linha. Após o índice 4, ele encontra o caractere 0 e interrompe o loop while. Lá você vê que existe um caractere 0.Todas as respostas são realmente boas, mas eu gostaria de adicionar outro exemplo para concluir todas essas
Para aqueles que não querem tentar isso no gdb online, a saída é:
https://linux.die.net/man/3/printf
Isso é útil para entender o que o terminador de escape faz? Não é um limite para uma matriz de caracteres ou uma string. É o personagem que dirá ao cara que analisa -STOP, (print) analisa até aqui.
PS: E se você analisar e imprimi-lo como uma matriz de caracteres
você obtém:
onde, o espaço em branco após o dobro l, é o terminador nulo, no entanto, ao analisar uma matriz de caracteres, será apenas o valor de caracteres de cada byte. Se você fizer outra análise e imprimir o valor int de cada byte ("% d%, char_array [i]), verá que (você obtém a representação ASCII code-int) o espaço em branco tem um valor 0.
fonte
A
C
função Inprintf()
retorna o número de caracteres impressos,\0
é umnull
terminador usado para indicar o final da string no idioma c e não existe umstring
tipo incorporado a partir dec++
, no entanto, o tamanho da sua matriz precisa ser pelo menos maior do que o númerochar
desejado armazenar.Aqui está o ref: cpp ref printf ()
fonte
Você está errado. Esta instrução não confirma que a literal da cadeia de caracteres
"hello"
não termina com o caractere zero final'\0'
. Esta declaração confirmou que a funçãoprintf
gera elementos de uma sequência até que o caractere zero final seja encontrado.Quando você está usando uma literal de cadeia de caracteres, como na instrução acima, o compilador cria uma matriz de caracteres com a duração do armazenamento estático que contém elementos da literal de cadeia de caracteres.
Então, de fato, essa expressão
é processado pelo compilador, algo como o seguinte
A ação da função printf nisto você pode imaginar da seguinte maneira
Para obter o número de caracteres armazenados na string literal "olá", você pode executar o seguinte programa
A saída do programa é
fonte
Você precisa limpar seu conceito primeiro. Como será limpo quando você lida com a matriz, o comando de impressão que você está usando apenas conta os caracteres que são colocados dentro da parêntese. É necessário na string de matriz que termine com \ 0
fonte
Uma string é um vetor de caracteres. Contém a sequência de caracteres que formam a sequência, seguida pela sequência final de caracteres especial: '\ 0'
Exemplo: char str [10] = {'H', 'e', 'l', 'l', 'o', '\ 0'};
Exemplo: o seguinte vetor de caracteres não é uma sequência porque não termina com '\ 0'
char str [2] = {'h', 'e'};
fonte