La dichiarazione dello sguardo fgets
funzione come questa:Come usare fgets() per evitare di trasmettere il suo secondo argomento che è di tipo int?
char *fgets(char *str, int n, FILE *stream);
Ciò significa che il secondo argomento dovrebbe essere un int
.
Qual è il modo corretto per evitare questa trasmissione nel seguente programma?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
const char *buffer = "Michi";
size_t len = strlen(buffer) + 1;
char arr[len];
printf("Type your Input:> ");
if (fgets(arr, (int)len, stdin) == NULL) {
printf("Error, fgets\n");
exit(1);
} else {
printf("Arr = %s\n", arr);
}
}
Qui ho usato (int)len
che sembra bene, ma cosa succede se buffer
memorizza una stringa molto lunga?
consente di dire:
const char *buffer = "Very long long ..."; /* where length is beyond the range of the `int` type */
ho già dichiarato la lunghezza del tipo size_t
che va bene qui, ma se io passo a fgets
non è OK a causa di:
conversion to ‘int’ from ‘size_t {aka long unsigned int}’ may alter its value
e se lo trasmetto a int
non si adatta perché la dimensione dello int
è inferiore alla dimensione di length
e alcune informazioni andranno perse.
forse mi manca qualcosa qui ...
Qualsiasi modo come dovrei evitare questa situazione?
Solo dicendo, in questo caso, sei sicuro 'char arr [len] ; 'funzionerà correttamente? È in pila con gcc, comunque .. –
@SouravGhosh Potrei usare malloc qui, ma la domanda non è su quello – Michi
Forse http://stackoverflow.com/questions/8317295/convert-unsigned-int-to-signed-int -C è utile per te. – Sergio