aiuto programmazione

DeletedUser

Guest
non so se lo devo mettere qui o in istruzione, ma ho dei problemi in un programma che stavo facendo in c:
char *c;
main()
{
scanf("%s",&c);
system(c);
}
il debug me lo fa fare, ma mi dice: errore di segmentazione.:( :doh:
 

DeletedUser

Guest
Ma tu inizializzi il puntatore? Se non lo inizializzi, punterai ad un valore di una variabile che non esiste e quindi ti dà quell'errore.

Ti faccio un esempio:
Codice:
#include <stdio.h>
#include <stdlib.h>
main(){
[INDENT]int x, *p;[/INDENT]
[INDENT]p = &x; /* inizializzi il puntatore */[/INDENT]
[INDENT]*p = 0; /* poni il puntatore pari a 0 */[/INDENT]
[INDENT]printf("x è %d", x);[/INDENT]
[INDENT]printf("p è %d", *p);[/INDENT]
[INDENT]exit(EXIT_SUCCESS);[/INDENT]
}

Questo ti restituirà x = 0 e *p = 0, con puntatore e variabile correttamente inizializzate.
 
Ultima modifica di un moderatore:

DeletedUser

Guest
se utilizzo scanf per dare il valore al puntatore cambia qualcosa?
comunque mi sa che hai ragione perchè avevo provato a fare la stessa cosa con la variabile assegnata direttamente(c="echo ciao") e funzionò... grazie:)
 

DeletedUser

Guest
grazie, ma purtroppo non ha funzionato, perlomeno:
ho aggiunto c = ""; per inizializzare la variabile, ma mi dice ancora errore di segmentazione.:(:boone:
forse è la funzione system che non permette l'inserimento del comando tramite variabile.
 

DeletedUser

Guest
Ma che cosa deve fare il programma? Prendere un valore da tastiera e stamparlo a video?
 

DeletedUser

Guest
la funzione system() permette di utilizzare i codici di MS-DOS. per esempio se scrivo system("echo ciao") si stampa la scritta ciao, ecc ecc
volevo fare in modo che l'utente possa immettere direttamente il codice.
 

DeletedUser

Guest
Sì, ma cosa deve fare il programma? Prendere un carattere, una stringa un valore dall'utente e restituirlo? Non ho ancora capito, sinceramente! L'errore di segmentazione te lo dà perché ancora non hai inizializzato il puntatore. Se mi spieghi bene cosa vuoi che faccia il programma ti posso aiutare, ma così non riesco a capire cosa deve fare. Se quello che ho intuito è giusto, tu vuoi che l'utente inserisca un valore (o un carattere, o una stringa) e che venga stampata di seguito, giusto?
 

DeletedUser

Guest
io voglio che il programma acquisisca una stringa dall'utente e poi la utilizzi come comando DOS. in pratica utilizzo scanf per acquisire una stringa come "echo ciao" e poi la utilizzo come comando DOS(echo ciao in dos stampa la scritta ciao). ma forse l'errore me lo dà perchè ho fatto scanf("%s",&c) e non scanf("%s",&*c)
ora provo...
niente sempre errore -.-
 

DeletedUser

Guest
Non è quello che fa System allora. System lancia dei programmi o servizi da shell. Ad esempio, per mettere il computer in pausa:
...
system("PAUSE");
...

Poi, due cose:
1) Come fai a sapere che la stringa inserita dall'utente sia un comando da shell? O specifichi in un altro punto del programma che l'utente è forzato ad inserire certe stringhe?
2) %c non può ritornare una stringa (%s ritorna la stringa (come array di caratteri)).

Codice:
#include <stdio.h>

#include <stdlib.h>



int main(){
	[INDENT]int x;
 /* prende un intero x */[/INDENT]
	[INDENT]printf("Inserisci il valore: "); /* chiede all'utente di inserire un valore*
[/INDENT]
	[INDENT]scanf("%d", &x);
/*prende il valore inserito*/[/INDENT]
	[INDENT]printf("Il valore inserito è: %d \n", x);/*lo restituisce con printf e va a capo*/
[/INDENT]
	[INDENT]exit(EXIT_SUCCESS);/*esce se il risultato del programma è 0*/
[/INDENT]
}
Questo chiede un valore all'utente, prende il valore e lo restituisce dopo. Per fare ciò che vuoi fare tu, dovrai specificare delle stringhe che l'utente è costretto ad inserire. Poi, al massimo non potrà essere system(c) perché c non è un argomento considerato valido. Se vuoi riportare un comando nella shell potresti provare a dare system("echo comando"), ma non sono nemmeno sicuro che funzioni.
 
Ultima modifica di un moderatore:

DeletedUser

Guest
io penso che l'errore sia nello scanf perchè ho fatto la stessa identica cosa con system(c) senza chiedere all'utente il comando ma settando direttamente la variabile come echo ciao, giusto per questo, comunque grazie mille per l'aiuto. Ho iniziato da qualche giorno col C... grazie veramente.
comunque la cosa strana è che il programma funziona se c = "echo ciao";system(c). Quindi mi sembra strano che non lo possa prendere da tastiera... anche perchè "errore di segmentazione. é stata causata una violazione d'accesso." mi uscia sempre quando dimenticavo di mettere & prima della variabile in scanf o comunque quando si presentavano errori in scanf.
comunque l'utente lo sa che deve usare comandi da shell.(sono io o quelli a cui do il programma).
 

DeletedUser

Guest
Per forza: se c = "echo ciao" echo ciao è un comando riconosciuto dalla shell che ti riproduce "ciao". Così il programma è corretto. L'errore di segmentazione te lo dà perché hai utilizzato un puntatore senza definire una variabile a cui deve puntare. Non usare il puntatore, usa una variabile. Comunque, quello che vuoi fare è abbastanza complicato per un fatto molto semplice: ti restituisce solo la prima parola della stringa. Dovresti creare un ciclo while che ti legge carattere per carattere la stringa e la stampa, così il comando dovrebbe funzionare. Se usi char x[100]="echo ciao"; system (x) ti funziona perché tu stai considerando tutta la variabile x (dato che è minore di 100 caratteri) e system(x) riconosce echo come un comando e stampa ciao. Il tuo problema è prendere tutta la stringa da scanf. Oppure potresti fare un'altra cosa: usare una specie di switch con dei valori interi, in modo da far selezionare all'utente tramite il numero assegnato il comando che vuole utilizzare (ad esempio: 1 è echo, 2 è shutdown, ecc.).
 

DeletedUser

Guest
Giusto quello che dice mirko. Per farti ancora più chiarezza sul tuo primo post, ti dico bene gli errori che hai commesso..

Codice:
char *c; 
main()
{
      scanf("%s",&c);
      system(c);
}

Intanto, sarebbe meglio non dichiarare variabili globali, perchè non dichiari il puntatore nel main?
Il puntatore è di tipo CHAR, quindi può puntare solo ad un char, cioè una LETTERA, non una stringa.
Lo scanf ha due errori. Il primo, %s prende in ingresso una stringa e te cerchi di assegnarlo ad un puntatore a char. Poi "&c" non si può scrivere in questo caso semplicemente perchè il puntatore non punta ad un bel niente, come fa il programma a sapere dove mettere ciò che l'utente scrive?

(si corregge usando una variabile al posto di un puntatore. In questo caso il puntatore non serve.)

Poi, system ( char ) non ti darà mai risultati, dato che la system su un singolo carattere non ha senso :D (oltretutto al massimo va scritto *c, cioè quel char cui punta il puntatore)

Perciò, per usare bene il C, dovresti intanto.. come è già stato detto:
- Creare un array di char, riempirlo via via con tutte le lettere che uno digita da command usando un ciclo.
- oppure facendolo scegliere tra una serie di stringhe preimpostate

Tutto questo esula ovviamente dai controlli di sicurezza sull'input, tanto a quanto ho capito è una cosa che fai per provare tu stesso.
 
Ultima modifica di un moderatore:

DeletedUser

Guest
si, grazie dell'aiuto, sono solo all'inizio della programmazione e a scuola non mi hanno ancora insegnato niente:mad: fortuna che ci siete voi e il resto di internet :D
grazie di tutto, mi dovrò studiare bene i puntatori...
 

DeletedUser

Guest
Comunque, se vuoi un consiglio, alla prima esperienza con la programmazione il linguaggio ottimale è Python: potenza incredibile e facilità.
print("Hello world!") è "Ciao Mondo!" in Python 3.1. mentre in C è:
#include <stdio.h>

main(){
printf("Hello World! \n");
}
 

DeletedUser

Guest
secondo me fa bene ad iniziare con il C. Forse è un pelo più complicato, ma dopo fatto il C ti rimangono abbastanza facili i linguaggi C-like.. tipo C++, Java.. Insomma.. sono ottime basi!
 

DeletedUser

Guest
io ho conosciuto diversi sistemi di programmazione... visual basic, pascal, c, batch e vbscript(se si possono considerare sistemi di programmazione).
non è esattamente una base, il c lo sto imparando perchè lo dovrò studiare per forza a scuola-.-... comunque non ho mai provato il pyton.
 

DeletedUser

Guest
Anch'io lo sto imparando per il tuo stesso motivo, ma per fortuna avevo delle basi di Python ed ero già entrato nell'ottica della programmazione, altrimenti programmare in C può essere abbastanza complesso.
 

DeletedUser

Guest
Ha grandi potenzialità, a livelli "elevati", è difficile programmarci. Ma per quanto si fa a scuola non è così disarmante :)
La parte un po' più difficile da capire concettualmente sono forse i puntatori :)
 

DeletedUser

Guest
finora a scuola mi hanno insegnato pascal e alla fine dell'anno sapevo fare praticamente solo repeat - until -.- e gli ultimi giorni ci hanno fatto una verifica su un programma che calcola l'area e il perimetro del rettangolo!o_O inutile dire che ho preso 9 ;)
comunque se farò in c le stesse cose che ho fatto in pascal, allora le so già fare.
 
In cima