mslomp
(usa Slackware)
Enviado em 04/11/2008 - 20:18h
cara, dá para fazer uma manobra que, dependendo o caso, é arriscada:
segue aí um exemplo prático:
#include <stdio.h>
int main(void) {
int n = 1; // n é o valor absoluto do índice negativo. 1 para -1, 2 para -2 etc
char teste[] = {'a','e','i','o','u'}; // um array de testes padrão
char* ptr = malloc(5*sizeof(char)); // aloca memória com tamanho suficiente
memcpy(ptr-(n*sizeof(char)) /* <-- o segredo está aqui */,teste,5*sizeof(char));
/* testando, de -1 a 3 */
printf("ptr[-1]: %c\n",ptr[-1]);
printf("ptr[0]: %c\n",ptr[0]);
printf("ptr[1]: %c\n",ptr[1]);
printf("ptr[2]: %c\n",ptr[2]);
printf("ptr[3]: %c\n",ptr[3]);
return 0;
}
observando o 1° argumento de memcpy, o que fizemos foi copiar teste para uma posição ptr - n vezes o tamanho de cada objeto (char nesse caso):
memcpy(ptr-(n*sizeof(char)),teste,5*sizeof(char));
obviamente isso pode causar um memory leak, portanto todo cuidado é pouco ao decrementar muito o índice, especialmente se mais alguma memória precise ser reservada na heap ao longo do código.
para verificar se um dado char está no array, você pode usar memchr (definido em string.h).
algo tipo:
if(memchr(teste,'e',strlen(teste))!=NULL)