Mientras escribía una función para contar en cuántas posiciones individuales aparece la cadena sub en la cadena s , descubrí que el bucle for no funcionaba cuando se usaba la cadena vacía como s .
char* s = ""; char* sub = "up"; for(int i = 0; i <= (strlen(s) - strlen(sub)); i++){ //stuff }En este caso, el ciclo continuó como si la condición no se cumpliera.
Sin embargo, si reescribo la condición de esta manera, funciona según lo previsto.
int max = strlen(s) - strlen(sub); for(int i = 0; i <= max; i++){ //stuff }Así que me preguntaba qué es lo que podría causar este tipo de comportamiento.
En la condición del bucle for
for(int i = 0; i <= (strlen(s) - strlen(sub)); i++){ //stuff } las dos expresiones strlen( s ) y strlen( sub ) tienen el tipo de entero sin signo size_t . Entonces, la expresión strlen(s) - strlen(sub) tampoco puede ser negativa.
Como strlen( sub ) es mayor que strlen( s ) , entonces su diferencia producirá un valor muy grande del tipo size_t .
Prueba esta llamada de printf
printf( "size_t( -2 ) = %zu\n", size_t( -2 ) );Su salida en algún sistema puede ser por ejemplo la siguiente
size_t( -2 ) = 4294967294 mientras que el valor si INT_MAX en el mismo sistema es igual a 2147483647 .
Además, como el valor INT_MAX es menor que el valor obtenido de la expresión anterior, puede obtener un bucle for infinito.
Lo que necesitas es reescribir la condición de la siguiente manera
for ( size_t i = 0; i + strlen( sub ) <= strlen(s); i++){ //stuff }