vectores que punteros puntero matrices funciones declaracion con comparar aritmetica c++ arduino

c++ - que - c manipulando el puntero a la matriz de caracteres, confusión



punteros y vectores en c (2)

He escrito un código para manipular punteros a una matriz de caracteres para formatear la hora y la fecha de una frase NMEA RMC para un arduino pro mini, así:

char *UTC = "120435"; char *DATE = "050117"; char TIME[9]; char *ptr = TIME; char *fieldPtr = UTC; for (int a = 0; a < 8; a++) { *ptr++ = *fieldPtr++; if (a == 1 || a == 3) { *ptr = '':''; ptr++; } } *ptr = ''/0''; Serial.print("TIME: "); Serial.println(TIME); //output: "12:04:35" //-OK char date[9]; ptr = date; fieldPtr = DATE; for (int a = 0; a < 8; a++) { *ptr++ = *fieldPtr++; if (a == 1 || a == 3) { *ptr = ''.''; ptr++; } } *ptr = ''/0''; Serial.print("TIME: "); Serial.println(TIME); //output: "d" //whatever follows DATE Serial.print("date: "); Serial.println(date); //output: "05.01.17" //-OK

La salida de TIME en la segunda ronda parece ser algún carácter que sigue a DATE en la memoria.

¿Alguien puede ayudarme por favor a explicar lo que está pasando?


Está leyendo y escribiendo fuera de los límites de la matriz.

Mira esta parte:

for (int a = 0; a < 8; a++) { *ptr++ = *fieldPtr++;

En el primer ciclo, accede a UTC mediante fieldPtr . En la memoria UTC ve así:

''1'' ''2'' ''0'' ''4'' ''3'' ''5'' ''/0''

Entonces, cuando a es 0 , lee 1 , cuando a es 1 , lee 2 y así sucesivamente. Me gusta:

''1'' ''2'' ''0'' ''4'' ''3'' ''5'' ''/0'' ^ ^ ^ ^ ^ ^ ^ ^ a=0 a=1 a=2 a=3 a=4 a=5 a=6 a=7

Para a=7 lee fuera de la matriz que es ilegal (es decir, bahvior indefinido).

Para la parte de escritura es más o menos lo mismo. Excepto que tiene dos incrementos adicionales de ptr . Entonces la escritura es:

TIME[0] TIME[1] TIME[2] TIME[3] TIME[4] TIME[5] TIME[6] TIME[7] TIME[8] ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ a=0 a=1 a=1 a=2 a=3 a=3 a=4 a=5 a=6 a=7

De nuevo, cuando a=7 escribes afuera de TIME . De hecho, escribe una vez más después del ciclo: *ptr = ''/0'';

Entonces todos juntos "Comportamiento indefinido".

Cuando tiene un comportamiento indefinido, desde el punto de vista del lenguaje no tiene sentido discutir lo que está sucediendo.

Sin embargo, puedes analizar lo que sucedió en tu sistema específico. Podría ser que cuando escriba DATE en el segundo ciclo y escriba fuera de la matriz DATE , los datos escritos puedan terminar en TIME y, por lo tanto, destruyan el valor original y, en consecuencia, obtenga copias incorrectas. Una vez más, observe que esto sería específico del sistema. En mi sistema, su código produce el resultado esperado a pesar del comportamiento indefinido.

Para solucionar su problema, vea la respuesta de @PaulOgilvie

Dado que se trata de cadenas de entrada de tamaño pequeño y fijo, una solución alternativa que evite todos los elementos del puntero podría ser:

char *UTC = "120435"; char TIME[9]; if (strlen(UTC) == 6) { sprintf(TIME, "%c%c:%c%c:%c%c", UTC[0], UTC[1], UTC[2], UTC[3], UTC[4], UTC[5]); printf("%s/n", TIME); } else { printf("wrong format/n"); // .... add error handling here .... }


Su ciclo tiene demasiadas iteraciones. Debe copiar las cadenas de entrada, que son de longitud 6, e inserta dos caracteres adicionales. Pero eso no cambia la longitud de entrada. Cambia tus bucles a:

for (int a = 0; a < 6; a++) { ...