Devo responder a uma pergunta de lição de casa para uma das minhas aulas. Especificamente, devo dizer se certas matrizes em C são consideradas cadeias ou não. Com base neste artigo ( https://www.geeksforgeeks.org/strings-in-c-2/ ), eu sei que strings são uma matriz de caracteres com o terminador nulo no final.
Meu hangup principal é uma parte da pergunta que faz uma matriz que se parece com isso:
char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };
Obviamente, essa é uma matriz de caracteres com um caractere final nulo no final. No entanto, ele ainda é considerado uma sequência, pois também possui um caractere final nulo no meio? Como isso afetará a string?
EDIT: Com base nos comentários, forneço a redação real da pergunta:
"Quais das matrizes a seguir podem ser consideradas" strings "para fins de usá-las como argumentos para funções strcpy (), strncpy (), strcmp (), strncmp () e strings similares (indicar todas as opções aplicáveis)?"
EDIT: Enviei um e-mail ao meu professor, pois a pergunta parecia ambígua (como várias pessoas apontaram). Se alguém estiver curioso, ele me disse: "Sim, é uma string. A chave é que existe um caractere nulo. Mas é claro que isso afetará qualquer operação de string; a string termina no caractere nulo".
fonte
"CS"
com alguns bytes de lixo anexados (nesse caso, o caractere NUL final é irrelevante). Mas não é uma string "como um todo". - No entanto, alimentá-lo comstrcpy
etc. não fará o seu PC explodir porque essas funções "verão" apenas a"CS"
parte.strcmp()
. Se ele pode ser usado como argumento para modificar funções de string depende de fatores adicionais que não são fornecidos.c1
é mutável, por isso não vejo por que não seria um argumento de destino válidostrcpy
ou similar, a menos que não fosse grande o suficiente para acomodar a cadeia de origem. Isso não faria com que não fosse uma sequência, apenas não adequada para um determinado objetivo.c1
satisfaria os requisitos básicos para argumentos de cadeia de caracteres para todas as funções de cadeia (estreita) da biblioteca padrão, incluindo todas as nomeadas especificamente, mas o comportamento pode não ser o que o chamador espera ou deseja (mesmo ignorando comportamentos indefinidos que podem ser desencadeados).char
. Qualquer tipo de caractere serve .Respostas:
c1
é na maior parte [1] equivalente a&c1[0]
, que está segurando uma string"CS"
,.Há uma segunda corda à espreita lá,
"324"
, a partir de&c1[3]
-, mas contanto que você acessarc1
comoc1
, a string"CS"
é todas as funçõesstrcpy()
et al. veria.[1]:
c1
é uma matriz,&c1[0]
é um ponteiro.fonte
c1
como a string de destino em umstrcpy()
comando? A questão é ambígua - na melhor das hipóteses.c1
como argumento parastrcpy()
. É uma corda perfeitamente comum em todos os sentidos. Sequências comuns geralmente contêm lixo restante após seus terminadores. O fato de esse lixo ser codificado no programa dá a impressão de que o autor pretende usar dec1
maneira não-string, mas isso não fazia parte da questão.c1
é equivalente a&c1[0]
" engana.c1
é uma matriz.&c1[0]
é um ponteiro.Se você deseja conhecer as especificidades da definição de uma string em C, acesse a fonte.
Do padrão C90 :
(Não houve alterações relevantes nos padrões posteriores.)
Portanto,
c1
contém duas seqüências consecutivas, "CS" e "324", mas não é uma sequência em si.Se passarmos uma matriz para uma função, ela decai para um ponteiro para o seu primeiro elemento, assim
+c1
aponta para uma string (a primeira), que é boa o suficiente para qualquer função que espera um ponteiro para a string. Não aponta para uma string "CS \ 0324", mas provavelmente é boa o suficiente para a pergunta dos instrutores, que é ambígua.fonte
+c1
aponta para uma sequência, porquec1
começa com uma sequência. Isso de nenhuma maneira, forma ou forma formac1
uma corda.Adicionando à resposta do @ DevSolar, algo que eu descobri depois de brincar com a string especificada, se fosse:
Se você produzir essa string, obterá
CS03240
e o tamanho dessa string será 7. No meu entendimento,\\0
é usado para denotar o caractere nulo ( ou seja\0
). Se você fizer:Você não vê nada no log de saída, mas se o fizer:
Você vê um
\0
, algo que é esperado porque, para gerar caracteres especiais, como barras invertidas ou aspas, é necessário usar um\
junto com eles.Algo que me intriga é a saída
CS03240
e o tamanho 7. É comum entender que o tamanho de uma string é o número de caracteres nela mais um (para o caractere nulo). Além disso, o tamanho é 7, mesmo para a sequênciachar c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };
,.Então, talvez um acompanhamento para esta pergunta, o que está acontecendo aqui?
fonte
'\\0'
não é um caractere nulo . É uma constante de vários caracteres. Ele tem um valor definido de implementação certamente fora da faixa dechar
.c1[]
não é uma string, pois não possui um caractere nulo . "você produz esta string" provavelmente resulta em um comportamento indefinido .char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };
é tamanho 7 porque é inicializado com 7 valores. Seu tamanho não tem nada a ver com cordas .char c1[] = { 1, 2, 3, 4, 5, 6, 7 };
ainda faria com que fosse tamanho 7.c1
contém uma picada? Essa é uma questão separada. Veja também