¿Cómo obtener la longitud de una entrada estándar en C?

Comenzaré con mi código:

char input[40]; fgets( input, 40, stdin ); if( checkPalin(input) == 0 ) { printf("%s ist ein Palindrom \n", input); } else { printf("%s ist kein Palindrom \n", input); } 

Lo que quiero hacer es: leer un poco de entrada estándar y verificar con mi función si es un Palindrome o no.

Mis problemas son los siguientes: ¿Cómo puedo obtener la longitud de la entrada estándar? Porque si es más grande que 40 caracteres quiero poner un mensaje de error y además quiero que mi matriz de caracteres sea la longitud exacta de la entrada real.

¿Alguien me puede ayudar?

fgets( input, 40, stdin );

la longitud de la entrada no debe ir más allá de 40 caracteres == 39 caracteres + carácter nulo

Si le da a la cadena una longitud de más de 39 caracteres, entonces fgets() lee los primeros 39 caracteres y coloca el nul character('\0') como 40 caracteres e ignora los caracteres restantes.

Si le asigna una cadena de menos de 39 caracteres, por ejemplo, 5 coloca lecturas de nueva línea y la longitud se convierte en 6 (excluyendo el carácter nulo)

No te olvides de quitar el carácter de nueva línea.

 char input[60]; fgets(input,sizeof input,stdin); 

Por ejemplo, si declara el tamaño del búfer de entrada con unos 60, entonces, si desea realizar una comprobación de errores para más de 40 caracteres.

Simplemente puede verificar con strlen() y comprobar que la longitud es mayor que 40. luego mostrar un mensaje de error

Si desea verificar el error con fgets() verifique con NULL

No hay ninguna función para hacerlo, necesitas escribirlo tú mismo. Es decir, leer byte a byte buscando el carácter EOF . Pero creo que lo estás haciendo para evitar el desbordamiento, ¿verdad? si la entrada tiene más de 40 caracteres, no es necesario porque está garantizada que la función fgets() no pone valores extra en su búfer, nunca es más grande que el tamaño solicitado: 40. El valor puede ser menor -o igual o igual, pero nunca mayor que.

EDITAR:

Por “¿Cómo obtener la longitud de una entrada estándar en C?” Estaba pensando que estás hablando de cuántos bytes hay en stdin . Lo siento por eso. Si desea strlen() cómo puede haber bytes en fgets() escritos, solo use strlen()

Con

fgets( input, 40, stdin );

se garantiza que la input tiene un número de caracteres menor que 40 (incluida la terminación nula)

No tienes que realizar comprobaciones.

Y para obtener el tamaño de la input , siempre puede usar la función strlen() en la input , ya que la cadena de caracteres producida de los fgets siempre termina en nulo.

Simplemente resultó que no es tan fácil escribir una función que usa fgets() repetidamente para devolver una cadena malloc() ed.

La función no realiza un informe de errores adecuado: si se produjo un error al utilizar realloc() o fgets() , se fgets() los datos recuperados hasta ahora.

Aparte de estos, la función demostró ser bastante útil.

 #include  #include  #include  char * read_one_line(FILE * in) { size_t alloc_length = 64; size_t cumulength = 0; char * data = malloc(alloc_length); while (1) { char * cursor = data + cumulength; // here we continue. char * ret = fgets(cursor, alloc_length - cumulength, in); printf("r %p %p %zd %zd %zd\n", data, cursor, cumulength, alloc_length, alloc_length - cumulength); if (!ret) { // Suppose we had EOF, no error. // we just return what we read till now... // there is still a \0 at cursor, so we are fine. break; } size_t newlength = strlen(cursor); // how much is new? cumulength += newlength; // add it to what we have. if (cumulength < alloc_length - 1 || data[cumulength-1] == '\n') { // not used the whole buffer... so we are probably done. break; } // we need more! // At least, probably. size_t newlen = alloc_length * 2; char * r = realloc(data, newlen); printf("%zd\n", newlen); if (r) { data = r; alloc_length = newlen; } else { // realloc error. Return at least what we have... // TODO: or better free and return NULL? return data; } } char * r = realloc(data, cumulength + 1); printf("%zd\n", cumulength + 1); return r ? r : data; // shrinking should always have succeeded, but who knows? } int main() { char * p = read_one_line(stdin); printf("%p\t%zd\t%zd\n", p, malloc_usable_size(p), strlen(p)); printf("%s\n", p); free(p); }