Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [ANSI C] creazione dinamica di una stringa

    salve

    io ho uno stupidissimo programma in C che mi sta facendo uscire pazzo

    Dovrebbe chiedere quanti simboli voglio, assegnarli ad una stringa e stamparli, la cosa piu' stupida del mondo che mi da un risultato bastardo !!!

    codice:
    #include <stdio.h>
    void firstLineCreator( char symbol, int manysymbol );   
    int main(void) {
        char symbol = '*';
        int manysymbol;
        printf("How many symbols do you want ?\n");
        scanf("%d", &manysymbol);
        firstLineCreator( symbol, manysymbol );
        return (0);
    }
    void firstLineCreator( char symbol, int manysymbol ) {
        char symbolline[manysymbol];
        int i;
        for( i = 0; i < manysymbol; i++ ) {
            symbolline[i] = symbol;
        }
        printf("%s\n",symbolline);   
    }
    risultato:
    codice:
    How many symbols do you want ?
    10
    **********‼
    ora ditemi cosa cavolo vogliono da me quei 2 !! quando nessuno gli ha detto di metterceli


    grazie
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  2. #2
    ma la cosa ancora piu' bastarda e' che se io scrivo
    1
    oppure 2
    oppure 3
    oppure 7
    oppure 11

    il programmino farda funziona alla perfezione

    Compilatore gcc su Dev-C++ per windows versione 4.9.9.0
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  3. #3
    Utente di HTML.it L'avatar di Ilmalcom
    Registrato dal
    Oct 2002
    Messaggi
    1,345
    Non puoi mica fare una cosa del genere Per creare stringhe dinamicamente devi utilizzare la funzione malloc. Inoltre non metti il carattere di terminazione di stringa che è piuttosto importante... Rispettando le tue specifiche, eccoti una funzione corretta

    codice:
    void firstLineCreator (char symbol, int manysymbol ) {
     char *symbolline;
     symbolline = malloc (manysymbol * sizeof (char));
     int i;
     for( i = 0; i < manysymbol; i++ ) {
            symbolline[i] = symbol;
     }
     symbolline[++i] = '\0';
     printf("%s\n",symbolline);
    }

  4. #4
    intanto grazie ... poi ...

    Originariamente inviato da Ilmalcom
    Non puoi mica fare una cosa del genere Per creare stringhe dinamicamente devi utilizzare la funzione malloc.
    perche' ?? ... cioe', se scrivo char string[10]; e li assegno uno ad uno va bene, se creo il contenuto in modo dinamico no ?
    se facessi un char string[100]; senza malloc non potrebbe essere concettualmente identica la cosa ?

    per non parlare che e' si vero che non avevo messo fagianamente il carattere di escape, ma e' anche vero che con la tua funzione fai un malloc su 10 e non su 11 ( 10 + quello di escape )


    ... queste cose proprio non le capisco .. a me sembra concettualmente identica come funzione



    aggiungo che comunque non funziona
    codice:
    void firstLineCreator( char symbol, int manysymbol ) {
        char *symbolline;
        symbolline = malloc (manysymbol * sizeof(symbol));
        int i;
        for( i = 0; i < manysymbol; i++ ) {
            symbolline[i] = symbol;
        }
        symbolline[(++i)] = '\0';
        printf("%s\n",symbolline);   
    }
    [Warning] assignment makes pointer from integer without a cast
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  5. #5
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Dipende da cosa vuoi creare te...in C non esiste il tipo stringa..per convenzione si considera una stringa un array di caratteri (allocato dinamicamente o staticamente), che contenga il carattere nullo '\0'.

    Nelle estensioni del gcc è possibile dichiarare una variabile array specificando al dimensione a runtime, come hai fatto tu nel tuo codice iniziale; se vuoi che tale array sia una stringa nel senso della convenzione sopra detta devi metterci il carattere di fine stringa '\0', quindi l'array deve essere dichiarato con una dimensione pari al numero di caratteri della stringa + 1, errorre che ha fatto anche Ilmalcom che ha scritto:

    symbolline = malloc (manysymbol * sizeof(symbol));

    che è sbagliato perche non tiene conto del carattere di fine linea che quindi sarà scritto fuori dall'array, mentre bisogna fare:

    symbolline = malloc ((manysymbol + 1) * sizeof(symbol));

    dove il ' + 1' sta proprio per il carattere di fine stringa.

    In generale per creare stringhe dinamicamente devi usare la malloc, perchè le variabili dichiarate staticamente, come gli array, hanno una durata limitata al blocco in cui avviene la dichiarazione.

    Comuqnue l'unico errore che avevi fato nel tuo codice iniziale era appunto la mancanza del carattere di fine stringa, per cui la funzione printf non sa dove finisce la stringa e va avanti a stampare caratteri finche non incontra tale carattere in memoria o finche non interviene un errore di memoria, ciao

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  6. #6
    Originariamente inviato da anx721
    ...
    infatti, quello ce dicevo io, il malloc lo devi fare su 10 + 1 .... per il resto tutto ok, ho capito e lo so, pero' perche' continua a non funzionare ?

    la malloc e' in una libreria diversa da stdio.h ?
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  7. #7
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    la malloc non è una libreira ma una funzione di libreria, precisamente della libreria stdlib.h; quello che hai avuto come risultato dal compilatore non è un errore, ma un warning che mi pare derivi dal fatto che non hai fatto il casting a (char *) sul risultato della malloc:

    symbolline = (char *)malloc (manysymbol * sizeof(symbol));

    se no indicami di preciso la riga a cui si riferisce il warning.

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  8. #8
    ma io la stdlib.h non la includevo

    cmq domani faccio prove e ti faccio sapere, grazie
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  9. #9
    Utente di HTML.it L'avatar di Ilmalcom
    Registrato dal
    Oct 2002
    Messaggi
    1,345
    Originariamente inviato da andr3a
    infatti, quello ce dicevo io, il malloc lo devi fare su 10 + 1 .... per il resto tutto ok, ho capito e lo so, pero' perche' continua a non funzionare ?

    la malloc e' in una libreria diversa da stdio.h ?
    La malloc è in stdlib. Scusa per il +1 che mi sono dimenticato, qui sulla versione che ho compilato io c'era E posso garantirti che, copia/incollando quella che ho scritto io, la funzione fa il suo compito, senza alcun problema in fase di compilazione con gcc.
    p.s. Il casting esplicito sulla malloc è deprecato

  10. #10
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Originariamente inviato da Ilmalcom
    p.s. Il casting esplicito sulla malloc è deprecato
    fatto sta che in c++ non si puo compilare senza eseguire il cast esplicito sui risultati della malloc.

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

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.