Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [C]Lettura stringhe

Visualizzazione discussione

  1. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Quote Originariamente inviata da SEGFAULT Visualizza il messaggio
    Il problema è che la fgets() scrive la stringa che viene presa in input nel buffer. Per forza di cose devi "dirgli" una dimensione massima entro la quale non si sfora la lunghezza del buffer.
    L' alternativa sarebbe quella di leggere la stringa carattere per carattere con la getchar(), allocando un carattere alla volta (oppure raddoppiando la dimensione del buffer ogni volta che serve più spazio), però se chiami troppe volte la realloc() può essere inefficiente.
    In realtà puoi benissimo usare fgets alla base:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define N 128
    
    static int cpy(char **line, size_t *n, int l, char *BUFFER, int tmp_l) {
      if(((*n)-l) < (tmp_l+1)) {
        *n =  l+tmp_l+1;
        char *tmp = (char *)realloc(*line, sizeof(char)*(*n));
        if(tmp == NULL) {
          return -2;
        }
        *line = tmp;
      }
      strcpy((*line)+l, BUFFER);
      return 0;
    }
    
    int get_line(char **line, size_t *n, FILE *f) {
      char BUFFER[N];
      int l = 0, tmp_l;
      while(1) {
        if(fgets(BUFFER, N, f) == NULL) {
          return -1;
        }
        tmp_l = strlen(BUFFER);
        if(BUFFER[tmp_l-1] == '\n') {
          BUFFER[--tmp_l] = '\0';
          break;
        }
        if(feof(f)) {
          break;
        }
        if(cpy(line, n, l, BUFFER, tmp_l)) {
          return -2;
        }
        l += tmp_l;
      }
      if(cpy(line, n, l, BUFFER, tmp_l)) {
        return -2;
      }
      return l+tmp_l;
    }
    
    int main(void) {
      char *l = NULL;
      size_t n = 0;
      while(get_line(&l, &n, stdin) >= 0) {
        printf("%s", l);
      }
      return 0;
    }
    A parte che se stai usando un compilatore tipo gcc puoi usare getline (funzione di libreria, che non è pienamente compatibile con la funzione presentata sopra).

    Edit 15:47 corretto errore di svista: BUFFER[--tmp_l] == '\0'; -> BUFFER[--tmp_l] = '\0';
    Ultima modifica di Scara95; 23-05-2014 a 15:49
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.