Salve a tutti, nonostante la mia ricerca su questo forum, non sono riuscito a trovare ciò che cerco, quindi chiedo direttamente. E' da un po' che vorrei sostituire una stringa statica in una dinamica in un mio sorgente. Mi spiego meglio. Si tratta della parte di un programma più ampio, che acquisisce una stringa ma onde evitare la limitazione dovuta alla staticità, vorrei eliminare il fatto di dichiarare l'array del tipo: array[<<numero di="" elementi="">>] per poi lavorare con questo, sostituendo il tutto con un array che alloca gli elementi durante l'esecuzione. Ovviamente non si è a conoscenza del numero di elementi dell'array prima dell'esecuzione, e non va chiesto un numero massimo di caratteri da poter usare all'utente prima dell'acquisizione. L'output deve essere del tipo:
Inserisci stringa: questa è la mia stringa che viene allocata al momento dell'esecuzione
La stringa inserita è: questa è la mia stringa che viene allocata al momento dell'esecuzione

Per cercare di "studiare" il problema, ho scritto questo sorgente in cui ho sfruttato l'idea alla base della soluzione, ma purtroppo crasha quando la stringa raggiunge più o meno i 100 caratteri :(

#include <stdio.h>
#include <stdlib.h>

int main() {
 int ch, i = 0;
 char *str;
 while ((ch = getchar()) != '\n'){
 str = (char*)malloc(sizeof(char));
    str[i] = ch;
     printf("\n%c", str[i]);
     printf(" ch vale %d", ch);
     i++;
 }
 str[i] = '\0';
 printf("   i vale %d", i);
 return(0);
}

In generale non credo di essere sulla retta via, chiedo il vostro aiuto :)

chiesto 02 Jan '17, 02:51

fra95ncy's gravatar image

fra95ncy
20114

modificato 02 Jan '17, 11:13

enzotib's gravatar image

enzotib ♦♦
14.1k113187

Non conosco il C, ma avendo usato altri linguaggi, mi sento di dire che potrebbe dipendere dal limite imposto dalla tipologia di stringa usata.

(02 Jan '17, 10:29) enzoge enzoge's gravatar image

L'errore fondamentale che fai è quello di allocare un solo carattere e poi, anziché usare solo str[0] usare invece str[i].

Un modo più efficiente di procedere è quello di leggere non un carattere per volta, ma N caratteri per volta, finché non termina l'input. Ti segnalo il seguente thread che propone varie soluzioni, tra cui un interessante caratteristica della funzione scanf, ovvero il modificatore m, che alloca la memoria per te:

http://stackoverflow.com/questions/16870485/how-can-i-read-an-input-string-of-unknown-length

coll. permanente

ha risposto 02 Jan '17, 11:23

enzotib's gravatar image

enzotib ♦♦
14.1k113187

modificato 02 Jan '17, 11:24

La tua risposta
abilita/disabilita anteprima

Segui questa domanda

Via email:

Una volta eseguito l'accesso potrai iscriverti a tutti gli aggiornamenti qui

Via RSS:

Risposte

Risposte e commenti

Basi di markdown

  • *corsivo* o __corsivo__
  • **grassetto** o __grassetto__
  • collegamento:[testo](http://url.com/ "titolo")
  • immagine?![alt testo](/path/img.jpg "titolo")
  • elenco numerato: 1. Foo 2. Bar
  • per aggiungere un'interruzione di riga, aggiungi due spazi a fine riga e premi «Invio»
  • è supportato anche semplice HTML

Tag:

×109

domanda posta: 02 Jan '17, 02:51

domanda visualizzata: 2,280 volte

ultimo aggiornamento: 02 Jan '17, 11:24

Chiedi è un servizio di supporto gestito da Ubuntu-it. Contattaci!

powered by OSQAPostgreSQL database
Ubuntu e Canonical sono marchi registrati da Canonical Ltd.