Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

411
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda