Obtuve este ejemplo de CS50. Sé que debemos verificar "s == NULL" en caso de que no haya memoria en la RAM. Pero no estoy seguro de por qué necesitamos verificar la longitud de la cadena de t antes de capitalizar.
#include <cs50.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { // Get a string char *s = get_string("s: "); if (s == NULL) { return 1; } // Allocate memory for another string char *t = malloc(strlen(s) + 1); if (t == NULL) { return 1; } // Copy string into memory strcpy(t, s); // Why do we need to check this condition? if (strlen(t) > 0) { t[0] = toupper(t[0]); } // Print strings printf("s: %s\n", s); printf("t: %s\n", t); // Free memory free(t); return 0; }¿Por qué necesitamos usar "if (strlen(t) > 0)" antes de capitalizar?
Conceptualmente, no hay ningún carácter en mayúsculas cuando la cadena está vacía.
Técnicamente, no es necesario. El primer carácter de una cadena vacía es 0 y toupper(0) es 0 .
Tenga en cuenta que strlen(t) > 0 también se puede escribir como t[0] != 0 o simplemente t[0] . No hay necesidad de calcular realmente la longitud de la cadena para averiguar si es una cadena vacía.
Además, asegúrese de leer la respuesta de chux para obtener una corrección con respecto al char firmado.
// Why do we need to check this condition?
No hay necesidad de cheque. Una cadena de longitud 0 consta únicamente de un carácter nulo y toupper('\0'); devuelve '\0' .
Avanzado : Sin embargo, se necesita algo más.
char puede actuar como un char firmado o sin firmar . Si t[0] < 0 , (quizás debido a la introducción de 'é'), entonces toupper(negative) es un comportamiento indefinido (UB). toupper() solo está definido para EOF (algunos negativos) y valores en el rango de unsigned char .
Un cambio de código más valioso, aunque pedante, sería acceder a los caracteres como si fueran unsigned char y luego llamar a toupper() .
// if (strlen(t) > 0) { t[0] = toupper(t[0]); } t[0] = (char) toupper(((unsigned char*)t)[0]); // or t[0] = (char) toupper(*(unsigned char*)t));Para cualquier cadena t , los índices válidos ( de los caracteres reales de la cadena ) serán de 0 a strlen(t) - 1 .
Usar strlen(t) como índice será el índice del terminador nulo (asumiendo que es una cadena terminada en nulo "adecuada").
Si strlen(t) == 0 , entonces t[0] será el terminador nulo. Y hacer toupper en el terminador nulo no tiene sentido. Esto es lo que hace la verificación, asegúrese de que haya al menos un carácter real (más allá del terminador nulo) en la cadena.
En otras palabras: comprueba que la cadena no esté vacía.