C Academy · Lezione

Problemi comuni di I/O

Problemi con buffer e newline

Lezione 4 di 413 passaggi

Problemi comuni di I/O è una lezione C Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C Academy include 4 lezioni in totale.

Errori comuni di I/O

L'input e l'output in C presentano alcune insidie ricorrenti. Conoscerle Le farà risparmiare ore di debug.

#include <stdio.h>
int main(void) {
    printf("Let us study I/O pitfalls\n");
    return 0;
}

La nuova riga residua

Dopo scanf("%d", ...), il tasto Invio lascia un \n nel buffer. Un successivo %c legge quella nuova riga invece dell'input effettivo.

#include <stdio.h>
int main(void) {
    char c = 'A';
    printf("Use a space before %%c to skip the leftover newline\n");
    printf("c = %c\n", c);
    return 0;
}

Risolvere il problema con uno spazio

Scrivere scanf(" %c", &c) con uno spazio iniziale indica a scanf di ignorare prima gli spazi bianchi.

#include <stdio.h>
int main(void) {
    char c = 'Z';
    printf("scanf(\" %%c\", &c) skips whitespace\n");
    printf("c = %c\n", c);
    return 0;
}

Dimenticare la e commerciale

Passare una variabile a scanf senza & fa sì che il valore venga memorizzato in un indirizzo errato e probabilmente provoca un arresto anomalo.

#include <stdio.h>
int main(void) {
    int n = 9;
    printf("Always pass &n, not n, to scanf for an int\n");
    printf("n = %d\n", n);
    return 0;
}

Specificatori non corrispondenti

Leggere un double con %f invece di %lf in scanf corrompe il valore. Per l'output si usa %f per entrambi, ma per l'input sono diversi.

#include <stdio.h>
int main(void) {
    double d = 2.5;
    printf("scanf needs %%lf for double; printf uses %%f\n");
    printf("d = %.1f\n", d);
    return 0;
}

Buffering dell'output

L'output può essere memorizzato nel buffer e non apparire immediatamente. Terminare con \n o chiamare fflush(stdout) lo forza.

#include <stdio.h>
int main(void) {
    printf("Flushed by newline\n");
    fflush(stdout);
    return 0;
}

gets è pericolosa

La vecchia funzione gets non verificava i limiti ed è stata rimossa dal C moderno. Usi invece fgets.

#include <stdio.h>
int main(void) {
    char buf[10];
    /* fgets(buf, sizeof buf, stdin); */
    buf[0] = 'H'; buf[1] = 'i'; buf[2] = 0;
    printf("buf = %s\n", buf);
    return 0;
}

Overflow del buffer con %s

Un semplice %s in scanf può scrivere oltre i limiti di un array piccolo. Lo limiti con una larghezza come %19s.

#include <stdio.h>
int main(void) {
    char name[20];
    printf("Use %%19s to leave room for the null terminator\n");
    name[0] = 0;
    printf("name length cap protects buffer\n");
    return 0;
}

fgets conserva la nuova riga

fgets memorizza la nuova riga finale. Spesso è necessario rimuoverla.

#include <stdio.h>
#include <string.h>
int main(void) {
    char line[] = "hello\n";
    line[strcspn(line, "\n")] = 0;
    printf("[%s]\n", line);
    return 0;
}

Ignorare i valori restituiti

Non controllare il valore restituito da scanf consente a un input errato di passare inosservato. Lo controlli sempre.

#include <stdio.h>
int main(void) {
    int n = 3;
    int items = 1;
    if (items != 1)
        printf("bad input\n");
    else
        printf("ok: %d\n", n);
    return 0;
}

Mettere tutto insieme in sicurezza

Un modello affidabile consiste nel leggere con fgets, analizzare con sscanf e controllare il risultato.

#include <stdio.h>
int main(void) {
    char line[] = "123";
    int n;
    if (sscanf(line, "%d", &n) == 1)
        printf("parsed %d\n", n);
    return 0;
}

Verifica rapida

Verifichi la Sua comprensione delle insidie dell'I/O.

Riepilogo: insidie comuni dell'I/O

Ha imparato a evitare gli errori più comuni.

  • Le nuove righe residue confondono %c; usi uno spazio iniziale
  • Passi sempre gli indirizzi con &
  • Usi %lf per leggere i double
  • Preferisca fgets a gets e limiti %s
  • Controlli i valori restituiti e svuoti il buffer dell'output
Gratis per iniziare

Impara C con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
39
Lezioni
144

Domande Frequenti

La lezione «Problemi comuni di I/O» è gratuita?

Sì — il testo completo di «Problemi comuni di I/O» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C Academy, passa a CoddyKit PRO. Il corso C Academy include 4 lezioni in totale.

Cosa imparerò in «Problemi comuni di I/O»?

Problemi con buffer e newline Eserciti C Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C Academy?

Non è richiesta alcuna esperienza precedente. C Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Problemi comuni di I/O»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C Academy?

Sì. Ogni lezione C Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Specificatori di formato di printf
  2. scanf e input
  3. Larghezza, precisione e flag
  4. Problemi comuni di I/O
← Torna a C Academy