Estoy leyendo de mi diccionario e imprimiendo la palabra + la longitud de la palabra para fines de prueba.
Uso strlen para obtener la longitud de la cadena. Sin embargo, los números que obtuve no son correctos. Creo que strlen no cuenta el carácter \0.
Estoy leyendo las primeras 10 palabras del diccionario. Mi salida esperada debería ser:
W:AL:1 W:A's L:3 W:AA's L:4 W:AB's L:4 W:ABM's L:5 W:AC's L:4 W:ACTH's L:6 W:AI's L:3 W:AIDS's L:6 W:AM's L:4Pero esto es lo que obtuve (Observe cómo las L: están en otra línea. Creo que aquí es donde está el problema):
W:A L:2 W:A's L:4 W:AA's L:5 W:AB's L:5 W:ABM's L:6 W:AC's L:5 W:ACTH's L:7 W:AI's L:5 W:AIDS's L:7 W:AM's L:5A continuación se muestra mi código:
FILE* dict = fopen("/usr/share/dict/words", "r"); //open the dictionary for read-only access if(dict == NULL) { return; } int i; i = 0; // Read each line of the file, and insert the word in hash table char word[128]; while(i < 10 && fgets(word, sizeof(word), dict) != NULL) { printf("W:%s L:%d\n", word, (int)strlen(word)); i++; }fgets() lee la nueva línea en el búfer si hay suficiente espacio. Como resultado, verá la nueva línea impresa cuando imprima word . Del manual de fgets:
fgets() lee como máximo un carácter inferior al tamaño de la secuencia y los almacena en el búfer al que apunta s. La lectura se detiene después de un EOF o una nueva línea. Si se lee una nueva línea, se almacena en el búfer. Un byte nulo de terminación ('\0') se almacena después del último carácter en el búfer.
(énfasis mío)
Tienes que recortarlo tú mismo:
while(i < 10 && fgets(word, sizeof(word), dict) != NULL) { size_t len = strlen(word); if ( len > 0 && word[len-1] == '\n' ) word[len] = '\0'; printf("W:%s L:%d\n", word, (int)strlen(word)); i++; }La razón es porque fgets extrae el carácter de nueva línea '\n' en su word de búfer cada vez, lo que lleva a un conteo mayor en 1 cada vez.