Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C] Lettura stringhe da tastiera

    Ciao a tutti

    Ho questo semplice pezzo di codice che non funziona...
    Voglio semplicemente leggere delle righe di testo da tastiera e stamparle
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    
    #define MAX 80
    
    int leggi_video(char testo[][MAX]);
    void stampa_matrice(char matrice[][MAX], int row);
    
    main()
    {
    	char testo[MAX][MAX];
    	int righe;
    
    	printf("Inserisci delle parole.\n");
    	righe=leggi_video(testo);
    	stampa_matrice(testo, righe);
    	return 0;
    }
    
    int leggi_video(char matrice[][MAX])
    {
    	int i=0;
    	char stringa[MAX+1];
    	while(fgets(stringa, MAX+1, stdin)!= NULL)
    	{
    		stringa[strlen(stringa)-1]='\0';
    		strcpy(matrice[i], stringa);
    		i++;
    	}
    	return(i);
    }
    
    void stampa_matrice(char matrice[][MAX], int row)
    {
    	int i;
    	for(i=0; i<row; i++)
    		printf("%s\n", matrice[i]);
    }

  2. #2

    Errore nel ritorno della fgets

    Ciao

    prova cosi

    Codice PHP:
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>

    #define MAX 80

    int leggi_video(char testo[][MAX]);
    void stampa_matrice(char matrice[][MAX], int row);

    main()
    {
        
    char testo[MAX][MAX];
        
    int righe;

        
    printf("Inserisci delle parole.\n");
        
    righe=leggi_video(testo);
        
    stampa_matrice(testorighe);
        return 
    0;
    }

    int leggi_video(char matrice[][MAX])
    {
        
    int i=0,j;
        
    char stringa[MAX+1];
        for(
    j=0;j<=1;j++)
            {
             
    fgets(stringaMAX+1stdin);
         
    stringa[strlen(stringa)]='\0';
         
    strcpy(matrice[i], stringa);
         
    i++;
        }
        return(
    i);
    }

    void stampa_matrice(char matrice[][MAX], int row)
    {
        
    int i;
        for(
    i=0i<rowi++)
            
    printf("%s\n"matrice[i]);

    tu avevi scritto while(fgets()!=NULL) che e sempre vero perche la fgets in caso di successo restituisce il puntatore alla tua stringa. In ogni caso ti linko un sito dove sicuramente te la spiega meglio di me

    http://www.cplusplus.com/reference/c...dio/fgets.html

    Ciau!


    EDIT: mi ero dimenticato un ';' e il suggerimento di MItaly

  3. #3
    Questo
    codice:
    stringa[strlen(stringa)-1]='\0';
    è errato (strlen si basa sul null finale per determinare la lunghezza della stringa); al posto di fgets usa gets.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Perchè questo codice invece funziona?

    codice:
    #include <stdio.h>
    #include <string.h>
    
    main()
    {
    	char riga[50+2];
    	char matrice[50][50+1];
    	int i=0, j=0;
    
    	while(fgets(riga, 50+2, stdin)!= NULL)
    	{
    		riga[strlen(riga)-1]='\0';
    		strcpy(matrice[i], riga);
    		i++;
    	}
    
    	for(j=0; j<i; j++)
    		printf("%s\n", matrice[j]);
    	return 0;
    }


    Mi risulta che:
    1) La fgets in fondo alla stringa inserisce sempre il carattere di fine stringa \0 e quindi è lecito l'utilizzo della strlen
    2) Quando la fgets incontra la fine del file ritorna NULL e questo fa uscire dal ciclo while


  5. #5
    Scusa, hai ragione; ho letto male la documentazione della funzione.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Ho scoperto che se riduco le dimensioni del vettore e della matrice funziona...
    Se sostituisco
    codice:
    #define MAX 80
    con
    codice:
    #define MAX 50
    sembra funzionare...
    Come mai?

  7. #7
    Il problema dipende dal numero di righe della matrice.
    Se ha più di 50 righe non funziona bene.
    A volte mi dice che è stato causato uno "stack fault"

    Cosa vuol dire? Dipende dalla memoria disponibile? Dipende dal compilatore?


  8. #8
    Probabilmente vuol dire che hai esaurito la memoria riservata per lo stack.
    Dovresti risolvere allocando dinamicamente l'array di stringhe.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.