Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

417
Vistas
¿Se supone que una función de cambio cambia la matriz que estoy tratando de duplicar en otra matriz con cambios menores?

Estoy aprendiendo a través del libro K&R y haciendo un ejercicio en el que se supone que debo copiar una matriz en otra con cambios menores (convirtiendo cadenas de escape en los signos y letras reales) usando una función de cambio escape(from,to) .

Parece que lo hice bien, pero lo que me desconcierta es que la matriz (desde) también se está cambiando en unas pocas letras. Me preguntaba por qué sucede esto y si no estoy lo suficientemente informado sobre el cambio o algo más.

 #include <stdio.h> #include <stdlib.h> #define MAX 250 int main() { char ar1[MAX]; char ar2[MAX]; int c; int i = 0; while((c = getchar()) != EOF) { if ( i < MAX - 1 ){ ar1[i] = c; i++;} else ar1[i++] = '\0'; } escape(ar1,ar2); printf("%s",ar2); printf("%s",ar1); return 0; } escape(char s[],char t[]) { int i = 0; int j = 0; while (i < MAX ) { switch(s[i]) { case '\n': t[j] = '\\'; j++; t[j++] = 'n'; i++; break; default: t[j] = s[i]; i++; j++; break; } } t[j] = '\0'; }
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

K&R está desactualizado, al igual que la versión de C que se encuentra en su interior, llamada C90. Esta versión anterior permitía varias fallas de lenguaje como "int implícito" y "funciones sin prototipo". ¿Qué sucede en esta versión anterior cuando escape(ar1,ar2); sin una declaración de función previa visible, es que el compilador "se arriesga" con los tipos utilizados; específicamente, asume que todo tiene el tipo int .

En su caso, el compilador C90 encuentra la llamada escape(ar1,ar2); luego dice: "Oh, chico, ¿qué es escape ? Nunca había oído hablar de eso antes. Probablemente sea una función de int escape (int, int) , ¿verdad? Hagámoslo y veamos si hay fuegos artificiales".

Mientras que en realidad debería haber sido un void escape (char s[],char t[]) para que su programa funcione según lo previsto.

De manera similar, cuando escribe escape(char s[],char t[]) , entonces se asume implícitamente que esta función devuelve int , que no es lo que desea.

Puede deshacerse de todos estos problemas actualizando al estándar C actual y también encontrar un libro menos desactualizado. En C estándar, su código no puede compilarse y no habrá sorpresas extrañas.

Independientemente de la versión de C, puede solucionar el problema proporcionando una declaración de función en formato prototipo (tipos presentes):

 void escape (char s[], char t[]); // function declaration, prototype format int main() { ... } void escape (char s[], char t[]) // function definition { ... }
over 4 years ago · Santiago Trujillo Denunciar

0

El ciclo en su función de escape siempre sobrepasará los límites de la matriz de salida. Incluso si no hay saltos de línea para escapar, el final t[j] = '\0'; lo hará porque ejecuta incondicionalmente MAX iteraciones del ciclo y, por lo tanto, incrementa j al menos MAX veces. Resultados de comportamiento indefinido, de los cuales modificaciones inesperadas a otras variables es una manifestación razonablemente común.

Usted estructura la matriz de entrada como una cadena, por lo que probablemente escape deba dejar de convertir datos cuando llegue al terminador de cadena. Sin embargo, para estar completamente seguro, también debe asegurarse de terminar cuando llena la matriz de salida si lo hace antes de procesar toda la entrada (y no olvide dejar espacio para el terminador de cadena de la salida).

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda