Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

210
Views
strlen no da la longitud de cadena correcta C

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:4

Pero 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:5

A 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++; }
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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++; }
over 4 years ago · Santiago Trujillo Report

0

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!