Achei que definir o primeiro elemento como nulo limparia todo o conteúdo de uma matriz char.
char my_custom_data[40] = "Hello!";
my_custom_data[0] = '\0';
No entanto, isso apenas define o primeiro elemento como nulo.
ou
my_custom_data[0] = 0;
em vez de usar memset
, pensei que os 2 exemplos acima deveriam limpar todos os dados.
Respostas:
Depende de como você deseja visualizar a matriz. Se você estiver vendo o array como uma série de caracteres, a única maneira de limpar os dados é tocar em cada entrada.
memset
é provavelmente a maneira mais eficaz de conseguir isso.Por outro lado, se você estiver escolhendo ver isso como uma string C / C ++ terminada em nulo, definir o primeiro byte como 0 limpará efetivamente a string.
fonte
Um array em C é apenas um local de memória, então, de fato, sua
my_custom_data[0] = '\0';
atribuição simplesmente define o primeiro elemento como zero e deixa os outros elementos intactos.Se você quiser limpar todos os elementos do array, terá que visitar cada elemento. É
memset
para isso:Geralmente, essa é a maneira mais rápida de cuidar disso. Se você pode usar C ++, considere std :: fill em vez disso:
fonte
Por que você acha que definir um único elemento limparia todo o array? Em C, especialmente, pouco acontece sem o programador programá-lo explicitamente. Se você definir o primeiro elemento como zero (ou qualquer valor), terá feito exatamente isso e nada mais.
Ao inicializar, você pode definir uma matriz para zero:
Caso contrário, não conheço nenhuma técnica diferente de memset ou algo semelhante.
fonte
Usar:
Ou:
fonte
memset(my_custom_data, 0, strlen(my_custom_data));
) limpará apenas o primeiro '\ 0', que pode estar além do final da matriz. Isso pode, ou não, estar bem.Experimente o seguinte código:
fonte
Por que não usar
memset()
? É assim que se faz.Definir o primeiro elemento deixa o resto da memória intocado, mas as funções str tratarão os dados como vazios.
fonte
Por favor, encontre abaixo onde eu expliquei os dados na matriz após os casos 1 e 2.
Caso 1:
Resultado:
Caso 2:
Resultado:
Embora definir o primeiro argumento como NULL resolva o problema, é aconselhável usar o memset
fonte
Não. Tudo o que você está fazendo é definir o primeiro valor como '\ 0' ou 0.
Se você estiver trabalhando com strings terminadas em null, então, no primeiro exemplo, você obterá um comportamento que imita o que você espera, no entanto, a memória ainda está configurada.
Se você quiser limpar a memória sem usar o memset, use um loop for.
fonte
Você deve usar o memset. Definir apenas o primeiro elemento não funcionará, você precisa definir todos os elementos - se não, como você poderia definir apenas o primeiro elemento como 0?
fonte
Escrever um caractere nulo para o primeiro caractere faz exatamente isso. Se você tratá-lo como uma string, o código que obedece ao caractere de terminação nulo o tratará como uma string nula, mas isso não é o mesmo que limpar os dados. Se você quiser realmente limpar os dados, precisará usar o memset.
fonte
Eu normalmente só faço assim:
fonte
Isso não está correto como você descobriu
Exatamente!
Você precisa usar o memset para limpar todos os dados, não é suficiente definir uma das entradas como nula.
No entanto, se definir um elemento da matriz como nulo significa algo especial (por exemplo, ao usar uma string de terminação nula em), pode ser suficiente definir o primeiro elemento como nulo. Dessa forma, qualquer usuário do array entenderá que ele está vazio mesmo que o array ainda inclua os chars antigos na memória
fonte
defina o primeiro elemento como NULL. imprimir o array char não lhe dará nada em troca.
fonte
Que tal o seguinte:
fonte
fonte
Experimente o seguinte:
fonte