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

    esercizio

    primi passi con il C...
    sto usando il libro di kernichan e ritchie (ottimo ) e mi sto scervellando con gli esercizi proposti

    ad esempio ce n'è uno che dice di scrivere un programma che quando incontra, in una riga di ingresso, + spazi vuoti o + tabs deve sostituirli con uno solo spazio o un solo tab rispettivamente, mentre quando la riga è completamente "bianca" la deve eliminare.
    dopo ORE di fatica il mio risultato è questo

    #include <stdio.h>
    #define MAX 1000

    int getline(char line[], int max);
    int counter_blanks(char line[], int lenght);

    int main()
    {
    char line[MAX];
    int i, p, lenght;

    lenght = 0;
    for (i = 0; i < MAX; ++i)
    line[i] = 0;

    while ((lenght = getline(line, MAX)) > 0) {
    p = EOF;

    if (counter_blanks(line, lenght) < lenght - 1){
    for (i = 0; i < lenght - 1; ++i){
    if (line[i] == ' ' || line[i] == '\t' || line[i] == '\n') {
    if (p != line[i])
    putchar(line[i]);
    }
    else
    putchar(line[i]);
    p = line[i];
    }
    }
    putchar('\n');
    }
    return 0;
    }

    int counter_blanks(char line[], int lenght)
    {
    int i;
    int count = 0;

    for (i = 0; i < lenght - 1; ++i) {
    if (line[i] == ' ' || line[i] == '\t' || line[i] == '\n')
    ++count;
    }

    return count;
    }

    int getline(char line[], int max)
    {
    int i,c;

    for (i=0; (c = getchar())!=EOF && i < max-1 && c != '\n'; ++i)
    line[i] = c;
    if (c == '\n') {
    line[i] = c;
    ++i;
    }
    line[i] = '\0';

    return i;
    }

    sembra ke funzioni, ma il problema è resenta dei bachi?? VVoVe: come faccio a trovarli??
    ad esempio se in ingresso ho un blank ed un tab consecutivi, il programma me li stamperà entrambi. e se volessi che in questo caso venga stampato solo il blanck indipendentemente se si trova prima o dopo del tab?? :master:

    premetto che sono ancora agli inizi: mai visti puntatori!!
    uso solo: if else while for putchar getchar e solo l'intestazione <stdio.h>

    non so se questo è il posto adatto per questo post, comunque vi rigrazio fgià se vorrete togliermi questi dubbi

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    per accorpare spazi e tab puoi usare diversi metodi , ad esempio nel ciclo che sostituisce i caratteri puoi verificare se il carattere corrente è un tab o spazio e se anche il carattere precedente era un tab o uno spazio;in questo caso salti tale carattere.

    il programma puoi renderlo più pulito; ad esempio puoi evitare di mettere il carattere di fine linea nelle righe lette. Inoltre puoi fare un unico ciclo di trasformazione della riga utilizzando un secondo array di appoggio. Puoi ad esempio scorrerti la riga originaria; se il carattere corrente non è spazio o tab lo inserisci nel secondo array; se è un tab o spazio e lo era anche il precedente allora non lo inserisci. Alla fine metti il carattere vuoto '\0' di fine stringha nell'array che puoi stampare come una stringa.

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Una soluzione è questa:
    codice:
    #include <stdio.h>
    #include <string.h>
    
    void compatta_stringa (char *buf)
    {
        char *s=buf, *d=buf;
        int c=0;
    
        do {
            *d = *s;
    
            if (*s == ' ' || *s == '\t')
                c++;
            else
                c = 0;
    
        if (c < 2)
            *d++;
    
        } while (*s++ != '\0');
    }
    
    int main (void)
    {
        char buffer[100], *p;
    
        while (fgets (buffer, sizeof (buffer), stdin) != NULL)
        {
            if ((p = strchr (buffer, '\n')) != NULL)
                *p = '\0';
    
            compatta_stringa (buffer);
            printf ("%s\n", buffer);
        }
    
        return 0;
    }
    L'unica cosa di cui non sono sicuro è quando dici: mentre quando la riga è completamente "bianca" la deve eliminare. Per completamente bianca cosa intendi??? Solo con N spazi??? Perché la mia funzione in quel caso aggiusta la stringa in modo da avere 1 solo spazio.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  4. #4
    intendo che se in una riga ho solo spazi e tab, allora quella riga non la devo stampare per niente.
    cmq grazie (ps: i puntatori per me sono ancora un mondo sconosciuto!!)

    e devo dire che l'idea dell'array di appoggio mi piace assai

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da aenima1891
    intendo che se in una riga ho solo spazi e tab, allora quella riga non la devo stampare per niente.
    Quindi la funzione (come la mia, per esempio) dovrebbe restituire una stringa vuota ("")???
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

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.