[RISOLTO][C] problemino con stringhe

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
cavaletto
Prode Principiante
Messaggi: 50
Iscrizione: mercoledì 4 giugno 2008, 23:05
Desktop: ubuntu
Distribuzione: Ubuntu 18.04 LTS x86_64
Sesso: Maschile
Località: Torino

[RISOLTO][C] problemino con stringhe

Messaggio da cavaletto »

innanzi tutto buon Natale..!  ;)

ecco un'altro programmino didattico che mi fa sclerare,
si tratta di introdurre caratteri da tastiera, il pc memorizza riga in vettore alla pressione di enter,
la confronta con altre righe memorizzate, se è piu lunga la memorizza in altro vettore,
quando trova EOF stampa su video la riga piu lunga:

ecco il sorgente:

Codice: Seleziona tutto

#include <stdio.h>
				
#define   MAXLINE  100

main()

{
	int len; /* lungh riga corrente*/
	int max;  /*lungh riga massima*/ 
	char line[MAXLINE];  /*riga di input*/
	char save[MAXLINE];  /*riga salvata lunghezza maggiore*/
		
	max = 0; /*azzera lungh max*/ 
	while ((len = leggeriga(line, MAXLINE)) > 0) 
			
		if (len > max)	{
			max = len;
			copia(line, save);
		}
			if (max > 0)   /*se c'è almeno una riga stampa su video la riga max*/
				printf("%s", save);
}
		/*function leggeriga*/
leggeriga (s, lim) 
char s[];		/*legge caratteri immessi da tastiera ed memorizza linea alla pressione di enter*/
int lim;				/* finchè non incontra EOF*/
{
 	int c, i;
	
	for (i = 0; i < (lim-1) && (c=getchar()) != EOF && c != '\n'; ++i)
		s[i] = c;
	if (c == '\n') {
		s[i] = c;
		++i;
	}
	s[i] = '\0';
	return (i);
}
		/*function copia*/
copia (s1, s2)	/* copia riga più lunga in save */
char s1[];
char s2[];
{
	int i;
	i = 0;
	while (s2[i] = s1[i] != '\0')
		++i;
[ i ]
lo compilo e apparentemente sembra tutto ok, lo eseguo nel terminale, parte e finisce senza errori apparenti, ma l'output che stampa è indecifrabile

ecco cosa succede:

noidue@noidue-desktop:~/C_program/FunzioniSottoprg$ ./confrontarighe
pocipod
opèikpb
opècvopfipibpoibpoxbpoxibpx
noidue@noidue-desktop:~/C_program/FunzioniSottoprg$


al posto di stampare la riga arrivano i simboli strani..
dove SBAGLIO..?

>:(
Ultima modifica di cavaletto il sabato 21 gennaio 2017, 22:08, modificato 2 volte in totale.
:muro:
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [C] problemino con stringhe

Messaggio da Zoff »

Hai dimenticato delle parentesi nei cicli e in generale stai usando una sintassi vecchia!

che guida/libro stai seguendo?
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
cavaletto
Prode Principiante
Messaggi: 50
Iscrizione: mercoledì 4 giugno 2008, 23:05
Desktop: ubuntu
Distribuzione: Ubuntu 18.04 LTS x86_64
Sesso: Maschile
Località: Torino

Re: [C] problemino con stringhe

Messaggio da cavaletto »

sto seguendo un videocorso del politecnico di torino. si è vecchio (credo sia antecedente al 2000)
il libro che devo ancora comprare é:
Deitel & Deitel, "C Corso completo di programmazione", casa editrice Apogeo

ho visto che nella libreria stdio c'è la funzione di lettura righa, ma a scopo didattico spero possa funzionare. dovro dare un esame scrivendo il programma su carta e col pc ho bisogno di testare se funge cio che scrivo, poi tutto sommato mi sta anche simpatico
:muro:
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [C] problemino con stringhe

Messaggio da Zoff »

Intanto modifica il tuo messaggio precedente mettendo il codice tra i tag [ code ] così almeno [ i ] non viene tradotto in corsivo e il tuo messaggio non è troppo lungo....
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
difesaparcosempione
Rampante Reduce
Rampante Reduce
Messaggi: 6031
Iscrizione: giovedì 27 luglio 2006, 19:06
Località: Torino
Contatti:

Re: [C] problemino con stringhe

Messaggio da difesaparcosempione »

while (s2 = s1 != '\0')
è giusta ?
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [C] problemino con stringhe

Messaggio da Zoff »

difesaparcosempione ha scritto: while (s2 = s1 != '\0')
è giusta ?
No mancano gli indici a causa del mancato uso dei tag code ma è sbagliata comunque.

il confronto != è prioritario risdpetto all'assegnazione = quindi in s2[ i ] ci va sempre 1 ecco perché viene stampato quel carattere che se si nota bene è il numero 0001
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
cavaletto
Prode Principiante
Messaggi: 50
Iscrizione: mercoledì 4 giugno 2008, 23:05
Desktop: ubuntu
Distribuzione: Ubuntu 18.04 LTS x86_64
Sesso: Maschile
Località: Torino

Re: [C] problemino con stringhe

Messaggio da cavaletto »

in teoria

Codice: Seleziona tutto

while (s2[i] = s1[i] != '\0')
		++i;
dovrebbe fare così:
finchè s1 è diverso da null
copia s1 in s2

ora provo a modificare...

grazie
:muro:
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [C] problemino con stringhe

Messaggio da Zoff »

cavaletto ha scritto: in teoria

Codice: Seleziona tutto

while (s2[i] = s1[i] != '\0')
		++i;
dovrebbe fare così:
finchè s1 è diverso da null
copia s1 in s2

ora provo a modificare...

grazie
Basta mettere le parentesi...

Codice: Seleziona tutto

while ( (s2[i] = s1[i]) != '\0')
		++i;
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
cavaletto
Prode Principiante
Messaggi: 50
Iscrizione: mercoledì 4 giugno 2008, 23:05
Desktop: ubuntu
Distribuzione: Ubuntu 18.04 LTS x86_64
Sesso: Maschile
Località: Torino

Re: [C] problemino con stringhe

Messaggio da cavaletto »

funzionaaaa... era proprio la parentesi in:

Codice: Seleziona tutto

while ((s2[i] = s1[i]) != '\0')
così funziona. grazie Zoff e grazie difesaparcosempione.
L'avevo capita malissimo questa riga di codice
ero convinto di doverla confrontare con null e se diversa copiarla, invece dovevo copiarla finchè non trovavo null
(good)
Ultima modifica di cavaletto il giovedì 23 dicembre 2010, 18:47, modificato 1 volta in totale.
:muro:
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti