Rimozione del carattere newline finale dall'input di fgets ()


236

Sto cercando di ottenere alcuni dati dall'utente e inviarli a un'altra funzione in gcc. Il codice è qualcosa del genere.

printf("Enter your Name: ");
if (!(fgets(Name, sizeof Name, stdin) != NULL)) {
    fprintf(stderr, "Error reading Name.\n");
    exit(1);
}

Tuttavia, trovo che abbia un \ncarattere newline alla fine. Quindi, se Johnentro, finisce per inviare John\n. Come lo rimuovo \ne invio una stringa corretta.


21
if (!fgets(Name, sizeof Name, stdin))(almeno non usare due negazioni,! e! =)

4
@Roger Pate "non usare due negazioni" -> hmmm, se scaviamo in profondità "non" e "negazione" sono entrambe negazioni . ;-). Forse "Usa if (fgets(Name, sizeof Name, stdin)) {.
chux - Ripristina Monica il

3
@chux, sono sicuro che intendeviif (fgets(Name, sizeof Name, stdin) == NULL ) {
R Sahu,

@RSahu Vero : fastidioso !:
chux - Ripristina Monica il

Risposte:


155

Il modo leggermente brutto:

char *pos;
if ((pos=strchr(Name, '\n')) != NULL)
    *pos = '\0';
else
    /* input too long for buffer, flag error */

Il modo leggermente strano:

strtok(Name, "\n");

Si noti che la strtokfunzione non funziona come previsto se l'utente immette una stringa vuota (ovvero preme solo Invio). Lascia \nintatto il personaggio.

Ce ne sono anche altri, ovviamente.


7
Qualsiasi libreria di runtime C che è a conoscenza del thread (vale a dire, la maggior parte di quelli che hanno come target una piattaforma multi-thread), strtok()sarà thread-safe (userà l'archiviazione locale del thread per lo stato 'inter-chiamata'). Detto questo, in genere è ancora meglio usare la strtok_r()variante non standard (ma abbastanza comune) .
Michael Burr,

2
Vedi la mia risposta per una variante completamente thread-safe e rientrante, simile al tuo strtokapproccio (e funziona con input vuoti). In effetti, un buon modo di implementare strtokè usare strcspne strspn.
Tim Čas,

2
È importante gestire il caso else se ci si trova in un ambiente in cui esiste un rischio di linee troppo lunghe. Troncare silenziosamente l'input può causare bug molto dannosi.
Malcolm McLean,

2
Se ti piacciono i one-liner e stai usando glibc, prova *strchrnul(Name, '\n') = '\0';.
twobit

Quando strchr(Name, '\n') == NULL, oltre a "input troppo lungo per buffer, errore flag", esistono altre possibilità: l'ultimo testo in stdinnon si è concluso con un '\n'o un raro carattere null incorporato è stato letto.
chux - Ripristina Monica il

440

Forse la soluzione più semplice utilizza una delle mie funzioni poco conosciute preferite strcspn():

buffer[strcspn(buffer, "\n")] = 0;

Se vuoi che gestisca anche '\r'(ad esempio, se lo stream è binario):

buffer[strcspn(buffer, "\r\n")] = 0; // works for LF, CR, CRLF, LFCR, ...

La funzione conta il numero di caratteri fino a quando non colpisce a '\r'o a '\n'(in altre parole, trova il primo '\r'o '\n'). Se non colpisce nulla, si ferma al '\0'(restituendo la lunghezza della stringa).

Nota che funziona benissimo anche se non c'è una nuova riga, perché si strcspnferma a '\0'. In tal caso, l'intera riga viene semplicemente sostituita '\0'con '\0'.


30
Questo gestisce anche il raro bufferche inizia con '\0', qualcosa che causa dolore per l' buffer[strlen(buffer) - 1] = '\0';approccio.
chux - Ripristina Monica l'

5
@chux: Sì, vorrei che più persone lo sapessero strcspn(). Una delle funzioni più utili nella libreria, IMO. Ho deciso di scrivere e pubblicare un sacco di hack comuni in C come questo oggi; strtok_run'implementazione utilizzando strcspned strspnè stato uno dei primi: codepad.org/2lBkZk0w ( Attenzione: Non posso garantire che è senza bug, ma è stato scritto in fretta e probabilmente ha alcuni). Non so dove li pubblicherò ancora, però, ma ho intenzione di farlo nello spirito dei famosi "piccoli hack".
Tim Čas,

4
Ho cercato modi per tagliare in modo robusto . Questo sembra essere l' unico one-liner corretto. è più veloce, anche se non così semplice. fgets()strcspn()strlen
chux - Ripristina Monica l'

6
@sidbushes: La domanda, sia nel titolo e il contenuto, chiede la fine riga da fgets()ingresso . Che è sempre anche la prima newline.
Tim Čas,

9
@sidbushes: capisco da dove vieni, ma non posso essere ritenuto responsabile dei risultati di ricerca di Google per termini specifici. Parla con Google, non con me.
Tim Čas,

83
size_t ln = strlen(name) - 1;
if (*name && name[ln] == '\n') 
    name[ln] = '\0';

8
Probabilmente genererà un'eccezione se la stringa è vuota, no? Come indice fuori portata.
Edward Olamisan,

1
@EdwardOlamisan, la stringa non sarà mai vuota comunque.
James Morris,

5
@James Morris In casi insoliti fgets(buf, size, ....)-> strlen(buf) == 0. 1) fgets()legge il primo chara '\0'. 2) size == 13) fgets()restituisce NULLquindi i bufcontenuti potrebbero essere qualsiasi cosa. (Tuttavia, il codice OP verifica NULL). size_t ln = strlen(name); if (ln > 0 && name[ln-1] == '\n') name[--ln] = '\0';
Suggerimento

2
Cosa succede se la stringa è vuota? lnsarebbe -1, salvo per il fatto che size_tnon è firmato, quindi scrivendo nella memoria casuale. Penso che tu voglia usare ssize_te controllare lnsia> 0.
circa

2
@ legends2k: una ricerca di un valore in fase di compilazione (in particolare un valore zero come in strlen) può essere implementata in modo molto più efficiente di una semplice ricerca char-by-char. Per quale motivo considererei questa soluzione migliore di una strchro strcspnbasata.
AnT

17

Di seguito è riportato un approccio rapido per rimuovere un potenziale '\n'da una stringa salvata da fgets().
Usa strlen(), con 2 test.

char buffer[100];
if (fgets(buffer, sizeof buffer, stdin) != NULL) {

  size_t len = strlen(buffer);
  if (len > 0 && buffer[len-1] == '\n') {
    buffer[--len] = '\0';
  }

Ora usa buffere lensecondo necessità.

Questo metodo ha il vantaggio collaterale di un lenvalore per il codice successivo. Può essere facilmente più veloce di strchr(Name, '\n'). Rif. YMMV, ma entrambi i metodi funzionano.


buffer, dall'originale fgets()non conterrà in "\n"alcune circostanze:
A) La riga era troppo lunga per buffercui solo la charprecedente '\n'viene salvata buffer. I caratteri non letti rimangono nel flusso.
B) L'ultima riga nel file non termina con a '\n'.

Se l'input contiene caratteri null incorporati '\0'da qualche parte, la lunghezza indicata da strlen()non includerà la '\n'posizione.


Alcune altre risposte ':

  1. strtok(buffer, "\n");non riesce a rimuovere il '\n'quando bufferè "\n". Da questa risposta - modificato dopo questa risposta per avvertire di questa limitazione.

  2. Quanto segue non riesce in rare occasioni in cui la prima charlettura fgets()è '\0'. Ciò accade quando l'input inizia con un incorporato '\0'. Quindi buffer[len -1]diventa buffer[SIZE_MAX]accesso alla memoria certamente al di fuori della gamma legittima di buffer. Qualcosa che un hacker può provare o trovare nella lettura folle dei file di testo UTF16. Questo era lo stato di una risposta quando questa risposta è stata scritta. Successivamente un non-OP lo ha modificato per includere codice come il controllo di questa risposta per "".

    size_t len = strlen(buffer);
    if (buffer[len - 1] == '\n') {  // FAILS when len == 0
      buffer[len -1] = '\0';
    }
  3. sprintf(buffer,"%s",buffer);è un comportamento indefinito: Rif . Inoltre, non salva spazi bianchi iniziali, separati o finali. Ora cancellato .

  4. [Modifica a causa di una buona risposta successiva ] Non ci sono problemi con 1 liner buffer[strcspn(buffer, "\n")] = 0;oltre alle prestazioni rispetto strlen()all'approccio. Le prestazioni nel taglio di solito non sono un problema dato che il codice sta eseguendo I / O - un buco nero del tempo della CPU. Se il codice seguente richiede la lunghezza della stringa o è altamente sensibile alle prestazioni, utilizzare questo strlen()approccio. Altrimenti strcspn()è un'ottima alternativa.


Grazie per la risposta utile Possiamo usare strlen(buffer)quando la dimensione del buffer è allocata in modo dinamico usando malloc?
rrz0

@ Rrz0 buffer = malloc(allocation_size); length = strlen(buffer);è errato - i dati in memoria indicati da buffersono sconosciuti. buffer = malloc(allocation_size_4_or_more); strcpy(buffer, "abc"); length = strlen(buffer);va bene
chux - Ripristina Monica il

grazie per questo!! sto seguendo un corso CS e questo è stato di grande aiuto per uno dei compiti. ho accreditato la tua risposta nel codice sorgente.
Nathaniel Hoyt

8

Diretto per rimuovere '\ n' dall'output dei fgets se ogni riga ha '\ n'

line[strlen(line) - 1] = '\0';

Altrimenti:

void remove_newline_ch(char *line)
{
    int new_line = strlen(line) -1;
    if (line[new_line] == '\n')
        line[new_line] = '\0';
}

1
Nota che sarebbe più sicuro da usare strnleninvece di strlen.
Mike Mertsock,

3
Un commento alla prima risposta negli stati collegati alla domanda "Nota che strlen (), strcmp () e strdup () sono sicuri. Le alternative 'n' ti offrono funzionalità aggiuntive."
Étienne,

4
@esker no, non lo farebbe. l'inserimento di un nnon aumenta magicamente la sicurezza, in questo caso renderebbe il codice più pericoloso. Allo stesso modo strncpy, con una funzione terribilmente pericolosa. Il post a cui ti sei collegato è un cattivo consiglio.
MM

3
Ciò fallisce miseramente per una stringa vuota ( ""). strlen()Restituisce anche size_tno int.
alca il

4
questo non è sicuro per una stringa vuota, scriverà all'indice -1. Non usare questo.
Jean-François Fabre

3

Per il taglio singolo "\ n",

void remove_new_line(char* string)
{
    size_t length = strlen(string);
    if((length > 0) && (string[length-1] == '\n'))
    {
        string[length-1] ='\0';
    }
}

per il taglio multiplo '\ n',

void remove_multi_new_line(char* string)
{
  size_t length = strlen(string);
  while((length>0) && (string[length-1] == '\n'))
  {
      --length;
      string[length] ='\0';
  }
}

1
Perché annidare ifquando puoi semplicemente scrivere una condizione usando &&? Quel whileloop ha una strana struttura; potrebbe semplicemente essere while (length > 0 && string[length-1] == '\n') { --length; string[length] = '\0'; }.
melpomene,

@melpomene grazie per il suggerimento. Aggiorna il codice.
BEPP,

1
Io suggerirei che la prima funzione è più naturale definito come: size_t length = strlen(string); if (length > 0 && string[length-1] == '\n') { string[length-1] = '\0'; }. Questo rispecchia anche meglio la seconda definizione (usando solo ifinvece di while).
melpomene,

@elpomene grazie. Ha senso. Ho aggiornato il codice.
BEPP,

1

Il mio modo per principianti ;-) Per favore fatemi sapere se è corretto. Sembra funzionare per tutti i miei casi:

#define IPT_SIZE 5

int findNULL(char* arr)
{
    for (int i = 0; i < strlen(arr); i++)
    {
        if (*(arr+i) == '\n')
        {
            return i;
        }
    }
    return 0;
}

int main()
{
    char *input = malloc(IPT_SIZE + 1 * sizeof(char)), buff;
    int counter = 0;

    //prompt user for the input:
    printf("input string no longer than %i characters: ", IPT_SIZE);
    do
    {
        fgets(input, 1000, stdin);
        *(input + findNULL(input)) = '\0';
        if (strlen(input) > IPT_SIZE)
        {
            printf("error! the given string is too large. try again...\n");
            counter++;
        }
        //if the counter exceeds 3, exit the program (custom function):
        errorMsgExit(counter, 3); 
    }
    while (strlen(input) > IPT_SIZE);

//rest of the program follows

free(input)
return 0;
}

1

I passaggi per rimuovere il carattere di nuova riga nel modo forse più ovvio:

  1. Determina la lunghezza della stringa all'interno NAMEusando strlen(), header string.h. Si noti che strlen()non conta il termine \0.
size_t sl = strlen(NAME);

  1. Verifica se la stringa inizia con o include solo un \0carattere (stringa vuota). In questo caso slsarebbe 0perché strlen()come ho detto sopra non conta \0e si ferma alla prima occorrenza di esso:
if(sl == 0)
{
   // Skip the newline replacement process.
}

  1. Controlla se l'ultimo carattere della stringa corretta è un carattere di nuova riga '\n'. In tal caso, sostituirlo \ncon a \0. Si noti che il conteggio degli indici inizia alle ore 0quindi dovremo fare NAME[sl - 1]:
if(NAME[sl - 1] == '\n')
{
   NAME[sl - 1] = '\0';
}

Nota se hai solo premuto Invio alla fgets()richiesta di stringa (il contenuto della stringa era costituito solo da un carattere di nuova riga) la stringa in seguito NAMEsarà una stringa vuota da allora in poi.


  1. Siamo in grado di combinare i passaggi 2. e 3. in una sola ifdichiarazione usando l'operatore logico &&:
if(sl > 0 && NAME[sl - 1] == '\n')
{
   NAME[sl - 1] = '\0';
}

  1. Il codice finito:
size_t sl = strlen(NAME);
if(sl > 0 && NAME[sl - 1] == '\n')
{
   NAME[sl - 1] = '\0';
}

Se preferisci una funzione per utilizzare questa tecnica gestendo fgetsle stringhe di output in generale senza dover riscrivere ogni volta, ecco fgets_newline_kill:

void fgets_newline_kill(char a[])
{
    size_t sl = strlen(a);

    if(sl > 0 && a[sl - 1] == '\n')
    {
       a[sl - 1] = '\0';
    }
}

Nell'esempio fornito, sarebbe:

printf("Enter your Name: ");

if (fgets(Name, sizeof Name, stdin) == NULL) {
    fprintf(stderr, "Error reading Name.\n");
    exit(1);
}
else {
    fgets_newline_kill(NAME);
}

Si noti che questo metodo non funziona se la stringa di input ha incorporato \0s in essa. Se così strlen()fosse, restituirebbe solo la quantità di caratteri fino al primo \0. Ma questo non è un approccio abbastanza comune, poiché le funzioni di lettura più stringhe di solito si fermano all'inizio \0e prendono la stringa fino a quel carattere nullo.

A parte la domanda da sola. Cercate di evitare doppie negazioni che compongono il codice unclearer: if (!(fgets(Name, sizeof Name, stdin) != NULL) {}. Puoi semplicemente farlo if (fgets(Name, sizeof Name, stdin) == NULL) {}.


Non sono sicuro del motivo per cui vorresti farlo. Il punto di rimuovere le nuove righe non è di terminare con null le stringhe; è per rimuovere le nuove righe. Sostituire a \ncon \0a alla fine di una stringa è un modo di "rimuovere" la nuova riga. Ma la sostituzione di \ncaratteri all'interno di una stringa cambia sostanzialmente la stringa. Non è raro avere stringhe con più caratteri di nuova riga intenzionali, e ciò taglierebbe effettivamente le estremità di quelle stringhe. Per rimuovere tali newline, il contenuto dell'array deve spostarsi a sinistra per sovrascrivere il file \n.
ex nihilo,

@exnihilo Come si può inserire una stringa con più newline usando fgets()?
RobertS supporta Monica Cellio il

Bene, potresti concatenare le stringhe ottenute da più chiamate a fgets(). Ma non capisco la tua obiezione: sei tu a proporre il codice per gestire più righe.
ex nihilo,

@exnihilo Hai ragione, ripenserò alla strategia. Volevo solo aggiungere un modo molto duro ma possibile per ottenere il risultato desiderato.
RobertS supporta Monica Cellio il

@exnihilo Ha modificato completamente la mia risposta e ha seguito l'approccio principale utilizzando strlenecc. Giustificazione per non essere un duplicato: 1. Spiegazione del codice per fasi. 2. Fornito come funzione e soluzione basata sul contesto. 3. Suggerimento per evitare espressioni di doppia negazione.
RobertS supporta Monica Cellio il

0

Tim Čas one liner è straordinario per le stringhe ottenute da una chiamata a fgets, perché sai che contengono una sola nuova riga alla fine.

Se ti trovi in ​​un contesto diverso e vuoi gestire stringhe che potrebbero contenere più di una nuova riga, potresti cercare strrspn. Non è POSIX, il che significa che non lo troverai su tutti gli Unices. Ne ho scritto uno per le mie esigenze.

/* Returns the length of the segment leading to the last 
   characters of s in accept. */
size_t strrspn (const char *s, const char *accept)
{
  const char *ch;
  size_t len = strlen(s);

more: 
  if (len > 0) {
    for (ch = accept ; *ch != 0 ; ch++) {
      if (s[len - 1] == *ch) {
        len--;
        goto more;
      }
    }
  }
  return len;
}

Per coloro che cercano un equivalente chomp Perl in C, penso che sia così (chomp rimuove solo la nuova riga finale).

line[strrspn(string, "\r\n")] = 0;

La funzione strrcspn:

/* Returns the length of the segment leading to the last 
   character of reject in s. */
size_t strrcspn (const char *s, const char *reject)
{
  const char *ch;
  size_t len = strlen(s);
  size_t origlen = len;

  while (len > 0) {
    for (ch = reject ; *ch != 0 ; ch++) {
      if (s[len - 1] == *ch) {
        return len;
      }
    }
    len--;
  }
  return origlen;
}

1
"perché sai che alla fine contengono un'unica riga." -> Funziona anche quando non c'è '\n'(o se la stringa è "").
chux - Ripristina Monica il

In risposta al tuo primo commento, la mia risposta lo conserva. Ho dovuto lanciare resetlen in strrcspnper quando non c'è \n.
Philippe A.

Perché usare goto end;invece di return len;?
Chqrlie,

@chqrlie dovevo uscire da questo inelegante loop a 2 livelli in cui mi sono imbattuto. Il danno è stato fatto. Perché non andare a Goto?
Philippe A.

Hai due tipi di gotos nel tuo codice: un inutile gotoche può essere sostituito con una returndichiarazione e un contrario gotoche è considerato malvagio. L'utilizzo strchraiuta a implementare strrspne strrcspnin modo più semplice: size_t strrspn(const char *s, const char *accept) { size_t len = strlen(s); while (len > 0 && strchr(accept, s[len - 1])) { len--; } return len; }esize_t strrcspn(const char *s, const char *reject) { size_t len = strlen(s); while (len > 0 && !strchr(reject, s[len - 1])) { len--; } return len; }
chqrlie

0

Se l'utilizzo getlineè un'opzione - Non trascurare i suoi problemi di sicurezza e se si desidera rinforzare i puntatori - è possibile evitare le funzioni di stringa poiché getlinerestituisce il numero di caratteri. Qualcosa come sotto

#include<stdio.h>
#include<stdlib.h>
int main(){
char *fname,*lname;
size_t size=32,nchar; // Max size of strings and number of characters read
fname=malloc(size*sizeof *fname);
lname=malloc(size*sizeof *lname);
if(NULL == fname || NULL == lname){
 printf("Error in memory allocation.");
 exit(1);
}
printf("Enter first name ");
nchar=getline(&fname,&size,stdin);
if(nchar == -1){ // getline return -1 on failure to read a line.
 printf("Line couldn't be read.."); 
 // This if block could be repeated for next getline too
 exit(1);
}
printf("Number of characters read :%zu\n",nchar);
fname[nchar-1]='\0';
printf("Enter last name ");
nchar=getline(&lname,&size,stdin);
printf("Number of characters read :%zu\n",nchar);
lname[nchar-1]='\0';
printf("Name entered %s %s\n",fname,lname);
return 0;
}

Nota : I [ problemi di sicurezza ] con getlinenon dovrebbero essere trascurati però.


-1

La funzione seguente è una parte della libreria di elaborazione delle stringhe che sto mantenendo su Github. Rimuove i caratteri indesiderati da una stringa, esattamente quello che vuoi

int zstring_search_chr(const char *token,char s){
    if (!token || s=='\0')
        return 0;

    for (;*token; token++)
        if (*token == s)
            return 1;

    return 0;
}

char *zstring_remove_chr(char *str,const char *bad) {
    char *src = str , *dst = str;
    while(*src)
        if(zstring_search_chr(bad,*src))
            src++;
        else
            *dst++ = *src++;  /* assign first, then incement */

    *dst='\0';
        return str;
}

Un esempio potrebbe essere l'uso

Example Usage
      char s[]="this is a trial string to test the function.";
      char const *d=" .";
      printf("%s\n",zstring_remove_chr(s,d));

  Example Output
      thisisatrialstringtotestthefunction

Potresti voler controllare altre funzioni disponibili o persino contribuire al progetto :) https://github.com/fnoyanisi/zString


È necessario rimuovere *in *src++;e make bad, tokene d const char *. Inoltre, perché non utilizzare al strchrposto di zChrSearch? *srcnon può essere '\0'nella tua zStrrmvfunzione.
Chqrlie,

Grazie @chqrlie! aggiornato il codice per riflettere i tuoi suggerimenti ..... zstring è iniziato come un progetto divertente con l'obiettivo di creare una libreria di manipolazione di stringhe senza utilizzare alcuna funzione di libreria standard, quindi non l'ho usatostrchr
fnisi,

1
Scrivere una " libreria di manipolazione di stringhe senza usare alcuna funzione di libreria standard " è un buon esercizio, ma perché dire ad altre persone di usarla? Semmai, sarà più lento e meno testato rispetto a qualsiasi libreria standard.
melpomene,

Questo sta facendo un lavoro diverso da quello che la domanda pone. Probabilmente può essere usato per sbarazzarsi dell'unica newline, ma sembra eccessivo.
Jonathan Leffler,

-1
 for(int i = 0; i < strlen(Name); i++ )
{
    if(Name[i] == '\n') Name[i] = '\0';
}

Dovresti provarlo. Questo codice sostanzialmente scorre la stringa fino a quando non trova "\ n". Quando viene trovato, "\ n" verrà sostituito dal carattere di terminazione null "\ 0"

Nota che stai confrontando i caratteri e non le stringhe in questa riga, quindi non è necessario usare strcmp ():

if(Name[i] == '\n') Name[i] = '\0';

poiché utilizzerai virgolette singole e non doppie. Ecco un link su virgolette singole o doppie se vuoi saperne di più


2
sarebbe meglio se spiegassi e modificassi il formato del tuo codice.
Anh Pham,

Di solito è meglio spiegare una soluzione invece di pubblicare solo alcune righe di codice anonimo. Puoi leggere Come posso scrivere una buona risposta , e anche Spiegare risposte interamente basate su codice .
Massimiliano Kraus,

1
Mi dispiace che questo sia stato il mio primo contributo qui. Io lo aggiusterò. Grazie per il feedback
Matheus Martins Jerônimo,

3
Inefficiente: for(int i = 0; i < strlen(Name); i++ )chiamerà strlen(Name)molte volte (cambi di loop Name[]) quindi con una lunghezza N, questa è una O(N*N)soluzione. È necessaria solo 1 chiamata a strlen(Name), se presente, per fornire una soluzione O (N) `. Non int iè chiaro il motivo per cui viene utilizzato invece di size_t i. Considerafor(size_t i = 0; i < Name[i]; i++ )
chux - Ripristina Monica il

@chux Altri similifor (size_t i = 0; Name[i]; i++) { if (Name[i] == '\n') { Name[i] = '\0'; break; } }
melpomene,

-1

Prova questo:

        int remove_cr_lf(char *str)
        {
          int len =0;


          len = strlen(str);

          for(int i=0;i<5;i++)
          {
            if (len>0)
            if (str[len-1] == '\n')
            {
              str[len-1] = 0;
              len--;
            }

            if (len>0)
            if (str[len-1] == '\r')
            {
              str[len-1] = 0;
              len--;
            }
          }

          return 0;
        }

1
len = strlen(str)potrebbe traboccare: strlenritorna size_t, no int. Che cosa sono gli strani if (len>0) if (...)condizionali? Non lo sai &&? Se hai intenzione di rimuovere più istanze finali di CR / LF, perché limitarti a 5? Perché non rimuoverli tutti? Perché la funzione ha un inttipo restituito quando ritorna sempre 0? Perché non semplicemente tornare void?
melpomene,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.