Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-01-2013, 15:48   #1
Hieicker
Senior Member
 
L'Avatar di Hieicker
 
Iscritto dal: Jun 2008
Città: Pordenone (PN)
Messaggi: 3699
[C] Piccolo aiuto con le stringe

Ciao a tutti! Son tornato con qualche altro dubbio. Sto cercando di provare le varie funzioni presenti in C riguardo le stringhe, come ad esempio la "strcmp" utilizzata per il confronto tra due stringhe. Sto quindi provando a fare una semplice funzioncina che prende in ingresso due stringhe e fa il confronto. Questo è il codice che ho scritto:

Quote:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int confronta_stringa(char *stringa, char *stringa2);

int main()
{
int operazione;
char *stringa;
char *stringa2;
float operatore1, operatore2;
printf("inserisci l'operazione che vuoi svolgere\n");
printf("1 - Riempi una stringa\n2 - Confronta Stringhe\n3");
scanf("%d",&operazione);

switch(operazione){
case 1:
push_stringa(stringa);
break;
case 2:
confronta_stringa(stringa, stringa2);
break;
default:
printf("Non hai digitato correttamente un numero");
break;
}
return 0;
}

int confronta_stringa(char *stringa, char *stringa2){
/*
int numero;
printf("quanti caratteri devono comporre la stringa?\n");
scanf("%d", &numero);
stringa = (char*) malloc(numero*sizeof(char));
*/
printf("Inserisci la prima stringa\n");
scanf("%s", stringa);
printf("inserisci la seconda stringa\n");
scanf("%s", stringa2);
if (!strcmp(stringa, stringa2))
printf("diversi");

return 0;
}
Ora quello che non capisco, è il fatto che dopo aver inserito le due stringhe ottengo un errore di segmentation fault. In più non ho ben chiaro se in questo caso (in cui non so di quanti caratteri sarà composta la stringa) mi conviene utilizzare la funzione malloc o se posso farne a meno.

Grazie,

Hieicker
__________________
PC» PSU: Evga Supernova GQ 750W | CPU: Intel Core i5 6600k | MOTHERBOARD: AsRock Z170 Extreme 4 | RAM: HyperX Fury 16Gb DDR4 2666Mhz | VGA: Gigabyte GTX1070 G1 | SSD: HyperX Savage 256Gb .. MONITOR: Dell U2311 @ 1920*1080

Playstation 4 | PSN Gamertag: Hieicker

Ultima modifica di Hieicker : 16-01-2013 alle 15:57.
Hieicker è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2013, 16:17   #2
Hieicker
Senior Member
 
L'Avatar di Hieicker
 
Iscritto dal: Jun 2008
Città: Pordenone (PN)
Messaggi: 3699
Ok grazie Antonio, anche se non ho ben presente cosa intendi con "terminatore". Comunque se vedi, la parte di codice in cui dovrei inserire il numero, attualmente è commentata, quindi non viene applicata.
__________________
PC» PSU: Evga Supernova GQ 750W | CPU: Intel Core i5 6600k | MOTHERBOARD: AsRock Z170 Extreme 4 | RAM: HyperX Fury 16Gb DDR4 2666Mhz | VGA: Gigabyte GTX1070 G1 | SSD: HyperX Savage 256Gb .. MONITOR: Dell U2311 @ 1920*1080

Playstation 4 | PSN Gamertag: Hieicker
Hieicker è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2013, 16:17   #3
M@Rk0
Senior Member
 
L'Avatar di M@Rk0
 
Iscritto dal: May 2008
Città: Torino - Valenza (AL)
Messaggi: 1221
prova ad usare
stringa = (char*) malloc((numero+1)*sizeof(char))
perchè ti serve anche il terminatore di stringa '/0'
poi non ho capito alcune cose del codice:
la funzione push_stringa(stringa) quando la usi?
fai la malloc solo per stringa e non per stringa2?
se specifichi n caratteri per la stringa poi non controlli che l'utente ne inserisca davvero (al massimo) n-1, ricadendo quindi nell'errore del terminatore mancante.
Credo che il sigseg ti venga fuori proprio perchè una volta premuto invio, provi a mettere n+1 caratteri in un'area di memoria grande n, quindi cerchi di accedere ad un'area "vietata" (spiegato un po' a cazzo di cane perchè a lezione stavo poco attento, mi bastava che i programmi che facevo funzionassero )

EDIT:
Quote:
Originariamente inviato da Hieicker Guarda i messaggi
Ok grazie Antonio, anche se non ho ben presente cosa intendi con "terminatore". Comunque se vedi, la parte di codice in cui dovrei inserire il numero, attualmente è commentata, quindi non viene applicata.
il terminatore di stringa è un carattere identificato da '/0' (ricorda che gli apici singoli delimitano un char e i doppi una string), serve per far capire che sei arrivato alla fine di una stringa (come il punto nella sintassi italiana, alla fine di una frase)

comunque se la parte commentata non viene applicata, tu crei soltanto due puntatori a stringa, non allochi lo spazio per scriverci dentro (cosa che faresti con la malloc commentata)

EDIT2: sono andato a rinfrescarmi la memoria. prova ad usare anche la fgets(stringa,numero,stdin) che legge numero caratteri dallo standard input

Ultima modifica di M@Rk0 : 16-01-2013 alle 16:22.
M@Rk0 è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2013, 17:08   #4
darksax
Member
 
Iscritto dal: Jan 2008
Città: Roma
Messaggi: 126
Dal listato sembra che manchi l'allocazione della memoria (malloc()) per
char *stringa;
char *stringa2;

se l'input delle stringhe, suppongo, dovrebbe avvenire con la funzione push_stringa(stringa);
(e stringa2 ??)
forse lo fai li dentro (allora manca '*' e '&')

Se invece utilizzi solo la (come sembra dal codice)
confronta_stringa()
allora ti manca sicuramente la malloc per le 2 stringhe
(la scanf non alloca spazio).
__________________
La forza dei forti sta nel traversare le traversie con occhio sereno! (PK) ...
I computer sono esattamente come gli esseri umani: fanno qualsiasi cosa tranne che pensare. (John Van Neumann)
Siamo brevi, il mondo è sovraffollato di parole. (Stanisław Jerzy Lec)
darksax è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2013, 10:11   #5
stohuman
Bannato
 
Iscritto dal: Dec 2012
Messaggi: 41
Quote:
Originariamente inviato da M@Rk0 Guarda i messaggi
(spiegato un po' a cazzo di cane perchè a lezione stavo poco attento, mi bastava che i programmi che facevo funzionassero )
Mi ricorda...



Tornando, nella funzione confronta_stringa()..

Codice:
int numero;
printf("quanti caratteri devono comporre la stringa?\n");
scanf("%d", &numero);
stringa = (char*) malloc(numero*sizeof(char));
Non so perche ma non mi torna.. apparte il fatto che nella malloc non metti anche stringa2, stringa ha gia dei blocchi in memoria, e col c "vecchio" non si puo riallocare piu memoria alla stessa variabile.
Ora se quello che sto dicendo non sono boiate dovresti dichiarare una terza stringa interna a quella funzione.
stohuman è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2013, 10:40   #6
darksax
Member
 
Iscritto dal: Jan 2008
Città: Roma
Messaggi: 126
Manca la malloc di stringa2 e lo spazio per il terminatore (\0).
Inoltre ti conviene impostare a size dei caratteri da accettare con la scanf()
per non incorrere in un buffer overflow.
percio' se allochi numero*sizeof(char)
dovrai avere in input numero*sizeof(char)-1

@stohuman
Si puo' riallocare un spazio gia' allocato con la "realloc"
__________________
La forza dei forti sta nel traversare le traversie con occhio sereno! (PK) ...
I computer sono esattamente come gli esseri umani: fanno qualsiasi cosa tranne che pensare. (John Van Neumann)
Siamo brevi, il mondo è sovraffollato di parole. (Stanisław Jerzy Lec)
darksax è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2013, 10:57   #7
stohuman
Bannato
 
Iscritto dal: Dec 2012
Messaggi: 41
Ero a conoscenza solo di malloc e calloc, sto ancora studiando questa parte
stohuman è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2013, 11:07   #8
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da darksax Guarda i messaggi
Inoltre ti conviene impostare a size dei caratteri da accettare con la scanf()
per non incorrere in un buffer overflow.
percio' se allochi numero*sizeof(char)
dovrai avere in input [b]numero*sizeof(char)-1
A scopo informativo, c'è da dire anche che finchè si tratta di array di caratteri sizeof(char) = 1 . Quindi scrivere numero o numero*sizeof(char) è identico.
È comunque buona pratica fare come dici tu

Lo specifico perchè quando io ho studiato sta cosa nessuno me lo aveva detto e sono diventato matto per capire come mai se allocavo un array di char andava e se lo facevo uguale con degli interi mi dava problemi.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2013, 11:11   #9
Hieicker
Senior Member
 
L'Avatar di Hieicker
 
Iscritto dal: Jun 2008
Città: Pordenone (PN)
Messaggi: 3699
Ragazzi grazie a tutti per il prezioso aiuto ! Ora sono al lavoro, ma stasera appena ho un po di tempo provo a seguire i vostri consigli allocando lo spazio per le due variabili stringa che uso.

La funzione push_stringa è una cosa a parte, quindi non tenetene conto .
__________________
PC» PSU: Evga Supernova GQ 750W | CPU: Intel Core i5 6600k | MOTHERBOARD: AsRock Z170 Extreme 4 | RAM: HyperX Fury 16Gb DDR4 2666Mhz | VGA: Gigabyte GTX1070 G1 | SSD: HyperX Savage 256Gb .. MONITOR: Dell U2311 @ 1920*1080

Playstation 4 | PSN Gamertag: Hieicker
Hieicker è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2013, 12:17   #10
darksax
Member
 
Iscritto dal: Jan 2008
Città: Roma
Messaggi: 126
[quote=darksax;38872526]
...
percio' se allochi numero*sizeof(char)
dovrai avere in input [b]numero*sizeof(char)-1

mi autoquoto
Per chiarezza si dovrebbe scrivere
numero*sizeof(char) - sizeof(char)
__________________
La forza dei forti sta nel traversare le traversie con occhio sereno! (PK) ...
I computer sono esattamente come gli esseri umani: fanno qualsiasi cosa tranne che pensare. (John Van Neumann)
Siamo brevi, il mondo è sovraffollato di parole. (Stanisław Jerzy Lec)
darksax è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2013, 14:45   #11
M@Rk0
Senior Member
 
L'Avatar di M@Rk0
 
Iscritto dal: May 2008
Città: Torino - Valenza (AL)
Messaggi: 1221
[quote=darksax;38873192]
Quote:
Originariamente inviato da darksax Guarda i messaggi
...
percio' se allochi numero*sizeof(char)
dovrai avere in input [b]numero*sizeof(char)-1

mi autoquoto
Per chiarezza si dovrebbe scrivere
numero*sizeof(char) - sizeof(char)
che raccogliendo diventa (numero-1)*sizeof(char)

comunque il problema sussiste sempre se non c'è un controllo su quanti caratteri verranno poi immessi da tastiera, quindi consiglierei l'uso di fgets(stringa,numero,stdin)
M@Rk0 è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2013, 15:31   #12
darksax
Member
 
Iscritto dal: Jan 2008
Città: Roma
Messaggi: 126
Ed in ultimo...
utilizzando la malloc devi ricordarti della free()
__________________
La forza dei forti sta nel traversare le traversie con occhio sereno! (PK) ...
I computer sono esattamente come gli esseri umani: fanno qualsiasi cosa tranne che pensare. (John Van Neumann)
Siamo brevi, il mondo è sovraffollato di parole. (Stanisław Jerzy Lec)
darksax è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2013, 17:10   #13
M@Rk0
Senior Member
 
L'Avatar di M@Rk0
 
Iscritto dal: May 2008
Città: Torino - Valenza (AL)
Messaggi: 1221
comunque se è un programma fine a se stesso per testare le funzioni che operano su stringhe, tanto vale barare:

non inizializzi i due puntatori a stringa nel main, la funzione perde gli argomenti, e nella funzione inizializzi le due stringhe con
Codice:
char stringa[numero+1];
char stringa2[numero+1];
dopo aver chiesto il numero
M@Rk0 è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2013, 21:07   #14
Hieicker
Senior Member
 
L'Avatar di Hieicker
 
Iscritto dal: Jun 2008
Città: Pordenone (PN)
Messaggi: 3699
Ciao ragazzi! Aggiornamento. Ho allocato le due stringhe ed ora la funzione sembra svolgere le sue istruzioni egregiamente. Tuttavia come dite voi potrei ottimizzarla ulteriormente. Innanzitutto non ho usato un terminatore. Nel manuale che sto leggendo non è ancora stato nominato, quindi vi chiedo... A che scopo viene utilizzato?
Inoltre non ho ben capito se sbaglio qualcosa nella alloc o nel modo in cui gli passo l'input. Ecco il codice. Ho aggiunto le due funzioni free per deallocare la memoria alla fine della funzione.

Quote:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int confronta_stringa(char *stringa, char *stringa2);

int main()
{
int operazione;
char *stringa;
char *stringa2;
float operatore1, operatore2;
printf("inserisci l'operazione che vuoi svolgere\n");
printf("1 - Riempi una stringa\n2 - Confronta Stringhe\n3 - Esci dal programma\n");
scanf("%d",&operazione);

switch(operazione){
case 1:
push_stringa(stringa);
break;
case 2:
confronta_stringa(stringa, stringa2);
break;
case 3:
break;
default:
printf("Non hai digitato correttamente un numero");
break;

}
return 0;
}

int confronta_stringa(char *stringa, char *stringa2){
int numero;
printf("quanti caratteri devono comporre ogni stringa?\n");
scanf("%d", &numero);
stringa = (char*) malloc(numero*sizeof(char));
stringa2 = (char*) malloc(numero*sizeof(char));
printf("Inserisci la prima stringa\n");
scanf("%s", stringa);
printf("inserisci la seconda stringa\n");
scanf("%s", stringa2);
if (!strcmp(stringa, stringa2))
printf("Le stringe da te inserite sono uguali");

free(stringa);
free(stringa2);
return 0;
}
Grazie ancora per l'aiuto .
__________________
PC» PSU: Evga Supernova GQ 750W | CPU: Intel Core i5 6600k | MOTHERBOARD: AsRock Z170 Extreme 4 | RAM: HyperX Fury 16Gb DDR4 2666Mhz | VGA: Gigabyte GTX1070 G1 | SSD: HyperX Savage 256Gb .. MONITOR: Dell U2311 @ 1920*1080

Playstation 4 | PSN Gamertag: Hieicker
Hieicker è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2013, 21:58   #15
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Lo '\0' viene utilizzato semplicemente per indicare la fine di una stringa.
Può essere utile in altre funzioni o in altri casi per capire quando la stringa è finita ( ad esempio strlen ritorna il numero di caratteri della stringa fino al terminatore '\0' -escluso ).
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2013, 22:15   #16
M@Rk0
Senior Member
 
L'Avatar di M@Rk0
 
Iscritto dal: May 2008
Città: Torino - Valenza (AL)
Messaggi: 1221
il terminatore di stringa '\0' (carattere che corrisponde a NULL) serve alle funzioni (anche quelle che potresti scrivere tu!) per sapere dove finisce una stringa (come strlen ad esempio).
Quando dici char stringa[10]; quello che succede è (in parole povere) che viene allocata in memoria un'area contigua di 10 Byte. Magari in quei 10 Byte prima c'era scritto qualcosa che non è più utilizzato, e c'è rimasto. Infatti se provi a fare un programma che alloca una stringa e poi la stampa direttamente vedrai che marasma di caratteri senza senso ti può venir fuori.
ES:
questa è la memoria prima di fare char stringa[10];
Codice:
Indirizzi di memoria: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |...
------------------------|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---
	   Contenuto: # | @ | 3 | x | + | ù | * | # | # | ò | ç | : | % | & | £ | € |...
(in realtà il contenuto è la codifica in bit dei caratteri che ho messo, ma per farla breve ho messo la rappresentazione in carattere)
mettiamo che alla richiesta di allocazione di memoria, lo scheduler del Sistema Operativo assegni lo spazio [3,4,5,6,7,8,9,A,B,C].
Ora, se fai printf("%c",stringa[0]); il risultato sarà il carattere 'x'.
mentre con printf("%s",stringa); darà in output "x+ù*##òç:%".
se a questo punto fai scanf("%s", stringa); e scrivi "ciao", il contenuto della memoria sarà questo:
Codice:
Indirizzi di memoria: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |...
------------------------|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---
	   Contenuto: # | @ | 3 | c | i | a | o | \0| # | ò | ç | : | % | & | £ | € |...
(ho evidenziato in rosso le locazioni di memoria riservate alla stringa, in marrone il contanuto e in arancione il contenuto modificato)

ora la printf di stringa darà in output "ciao", perchè legge fino al terminatore.
se il terminatore non fosse stato aggiunto (in automatico dalla scanf), avresti stampato "ciao##òç:%"

il terminatore serve ad esempio anche per leggere manualmente una stringa, magari carattere per carattere facendo un ciclo
Codice:
int i=0;
while(stringa[i]!='\0')
{
	fai_qualcosa(argomento1,argomento2);
	i++;
}
spero di non aver detto minchiate.
ah ho visto ora il reply di kwb (che quando ho iniziato a scrivere non c'era) e in sostanza ho detto quello

Ultima modifica di M@Rk0 : 17-01-2013 alle 22:22.
M@Rk0 è offline   Rispondi citando il messaggio o parte di esso
Old 18-01-2013, 10:42   #17
darksax
Member
 
Iscritto dal: Jan 2008
Città: Roma
Messaggi: 126
Inoltre la scanf() al termine dell'input di una stringa inserisce il terminatore.
Quindi se inserisci 10 caratteri in realta ne ritrovi 11...
Ecco spiegato xche' i buffer stringa e stringa2 devono prevedere nella malloc un "+sizeof(char)"...

stringa = (char*) malloc(numero*sizeof(char));
stringa2 = (char*) malloc(numero*sizeof(char));


Facendo cosi' sei a rischio....(prima o poi vai in crash)
__________________
La forza dei forti sta nel traversare le traversie con occhio sereno! (PK) ...
I computer sono esattamente come gli esseri umani: fanno qualsiasi cosa tranne che pensare. (John Van Neumann)
Siamo brevi, il mondo è sovraffollato di parole. (Stanisław Jerzy Lec)
darksax è offline   Rispondi citando il messaggio o parte di esso
Old 18-01-2013, 11:15   #18
darksax
Member
 
Iscritto dal: Jan 2008
Città: Roma
Messaggi: 126
Se numero vale 10 ed inserisci 10 caratteri, debbugando i 2 buffer ti accorgi che ti funziona xche' probabilmente lo spazio successivo al buffer non e' utilizzato (insidiosa botta di c.),

Riprendendo l'esempio di M@Rk0, prova ad immaginare se le due variabili stringa siano allocate in modo contiguo nella memoria (stringa seguita dal buffer stringa2) ma inserite nell'ordine stringa2 e poi stringa e ricordando che la scanf aggiunge un \0 alla fine dell'input.

Ammettiamo che la malloc ritorni questi 2 puntatori
Codice:
*stringa  = 0x02
*stringa2 = 0x0c
Inserisco Stringa2
Codice:
      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f 
0000  .  .  .  .  .  .  .  .  .  .  .  .  s  t  r  i
0010  n  g  a  _  2  2  \0 .  .  .  .  .  .  .  .  .
e poi Stringa
Codice:
      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f 
0000  .  .  s  t  r  i  n  g  a  _  1  1  \0 t  r  i
0010  n  g  a  _  2  2  \0 .  .  .  .  .  .  .  .  .
Il passo successivo e' la strcmp()...
Quale sara' il confronto?

*stringa = 0x02 vale "stringa_11"
*stringa2 = 0x0c vale ""
Quindi il confronto e' giustamente falso (xche' ho inserito valori differenti) ma i valori che utilizzo sono differenti da quelli che mi aspetto!!!!
Ma sopratutto se dopo Stringa2 la zona di memoria era occupata da un'altra variabile (x esempio un'altro puntatore) utilizzando quest'ultima variabile avrei un risultato catastrofico

Questo e' il famoso Buffer Overflow ed e' uno dei bachi piu' facili da generare e piu' difficili da trovare, anche xche' normalmente l'errore ti si presenta a km di distanza dalla parte di codice sbagliata....
__________________
La forza dei forti sta nel traversare le traversie con occhio sereno! (PK) ...
I computer sono esattamente come gli esseri umani: fanno qualsiasi cosa tranne che pensare. (John Van Neumann)
Siamo brevi, il mondo è sovraffollato di parole. (Stanisław Jerzy Lec)
darksax è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2013, 20:40   #19
Hieicker
Senior Member
 
L'Avatar di Hieicker
 
Iscritto dal: Jun 2008
Città: Pordenone (PN)
Messaggi: 3699
Eccomi ! Scusate l'ultra mega ritardo ma ho avuto da fare. Periodo decisamente incasinato. Comunque...
Lo stato attuale della funzione è il seguente:

int confronta_stringa(char *stringa, char *stringa2){
int numero;
printf("quanti caratteri devono comporre ogni stringa?\n");
scanf("%d", &numero);
stringa = (char*) malloc(numero*sizeof(char));
stringa2 = (char*) malloc(numero*sizeof(char));
printf("Inserisci la prima stringa\n");
scanf("%s", stringa);
printf("inserisci la seconda stringa\n");
scanf("%s", stringa2);
if (!strcmp(stringa, stringa2))
printf("Le stringe da te inserite sono uguali");

free(stringa);
free(stringa2);
return 0;
}

Da quello che ho capito, usando la scanf non devo utilizzare il terminatore perchè lo aggiunge da sola giusto? Tuttavia devo controllare che non venga inserito una stringa più grande dello spazio allocato. Che tipo di controllo posso mettere? Come si autogestisce la macchina in questo caso?

Grazie
__________________
PC» PSU: Evga Supernova GQ 750W | CPU: Intel Core i5 6600k | MOTHERBOARD: AsRock Z170 Extreme 4 | RAM: HyperX Fury 16Gb DDR4 2666Mhz | VGA: Gigabyte GTX1070 G1 | SSD: HyperX Savage 256Gb .. MONITOR: Dell U2311 @ 1920*1080

Playstation 4 | PSN Gamertag: Hieicker
Hieicker è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Alcuni rivenditori giapponesi bloccano l...
Le feste non placano Amazon, anzi: aggio...
Roborock Q10 S5+ a un super prezzo: robo...
Formula sceglie WINDTRE BUSINESS per gar...
EXPO 1.20: AMD migliora il supporto all'...
MacBook Pro con chip M4, 24GB di RAM e 1...
Lefant M330 da 6.000Pa a 139€ o ECOVACS ...
Tornano gli sconti anche sulle scope ele...
Le scope elettriche Dreame H12, H14 e H1...
Il nucleo della cometa interstellare 3I/...
La Russia potrebbe sviluppare un'arma pe...
Manda la RAM Corsair in assistenza, rice...
ASUS ROG G1000 con 'AniMe Holo': saranno...
Un test di longevità ha messo alla prova...
Incat inizia i test dell'incredibile tra...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 11:23.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v