saber - Cadena C a mayúsculas en C y C++
programa de mayusculas a minusculas c++ (4)
Con respecto a la respuesta anterior, la ''f'' nunca se pasa dentro de la función, debe intentar usar esto:
while ((*beg = (char) toupper(*beg))) beg++;
Mientras estaba armando una función de mayúsculas en C ++ noté que no recibí el resultado esperado en C.
Función de C ++
#include <iostream>
#include <cctype>
#include <cstdio>
void strupp(char* beg)
{
while (*beg++ = std::toupper(*beg));
}
int main(int charc, char* argv[])
{
char a[] = "foobar";
strupp(a);
printf("%s/n", a);
return 0;
}
Salida como se esperaba:
FOOBAR
Función c
#include <ctype.h>
#include <stdio.h>
#include <string.h>
void strupp(char* beg)
{
while (*beg++ = toupper(*beg));
}
int main(int charc, char* argv[])
{
char a[] = "foobar";
strupp(a);
printf("%s/n", a);
return 0;
}
La salida es el resultado esperado con el primer carácter que falta.
OOBAR
¿Alguien sabe por qué el resultado se trunca al compilar en C?
El problema es que no hay un punto de secuencia en
while (*beg++ = toupper(*beg));
Así que tenemos un comportamiento indefinido. Lo que el compilador está haciendo en este caso es evaluar beg++
antes de toupper(*beg)
En C donde en C ++ lo está haciendo de la otra manera.
La línea
while (*beg++ = toupper(*beg));
contiene un efecto secundario en una entidad que se utiliza dos veces. No se puede saber si se ejecuta o no beg ++ antes o después de * beg (dentro del toupper). Tienes suerte de que ambas implementaciones muestren ambos comportamientos, ya que estoy bastante seguro de que es lo mismo para C ++. (Sin embargo, hubo algunos cambios en las reglas para c ++ 11, de los cuales no estoy seguro, aún así es un estilo malo).
Simplemente mueva el beg ++ fuera de la condición:
while (*beg = toupper(*beg)) beg++;
while (*beg++ = std::toupper(*beg));
conduce a un comportamiento indefinido.
Si *beg++
está secuenciado antes o después de que std::toupper(*beg)
no esté especificado.
La solución simple es utilizar:
while (*beg = std::toupper(*beg))
++beg;