Newsgroup: it.comp.lang.c
Titolo: restituisci sotto stringa

Salve,
ho programmato in C un po' di tempo fa ma ora sono arrugginito e per giunta
non ho un compilatore.Mi aiutate a scrivere il seguente, semplice, programma
rigorosamente in Ansi C? Il programma mi deve chiedere di inserire una
stringa, ad esempio: aazzzzzennkkozxxf.
Mi dovrà resituire la sottostringa di caratteri uguali più lunga, in questo
caso mi restituisce: zzzzz. OK?
se gli avessi dato in input: mkkkolppvx mi avrebbe restituito: kkk.
Grazie, spero rispondiate presto
--------------------------------
Inviato via 
http://usenet.libero.it

 caso mi restituisce: zzzzz. OK?
Potresti usare due coppie di puntatori, ai caratteri di inizio e fine 
sequenza; la prima coppia per la stringa massima trovata al momento, la 
seconda coppia per quella nuova che stai cercando.
Quando la seconda coppia di puntatori ha in mezzo una lunghezza maggiore 
della prima coppia, aggiorni la stringa massima trovata.
Restano poi da capire i dettagli, tipo cosa fare se ci sono più 
sottostringhe di lunghezza massima uguali; ed anche come riportare la 
stringa di risposta -- se la stringa iniziale è modificabile basta 
troncarla al punto richiesto, altrimenti è necessario avere uno spazio 
su cui copiare la sottostringa, eventualmente dinamico con malloc() o 
strdup().
Qualcosa del genere:
---------
char *longest( char *s )
{
     char	*ps, *pe;
     char	*ns, *ne;
     char	ch;
     ps = pe = ns = ne = s;
     ch = *s;
     while( *s )
     {
	if( *s == ch )
	    ne = s;
	else
	{
	    if( (int)(pe - ps) < (int)(ne - ns) )
	    {
		ps = ns;
		pe = ne;
	    }
	    ns = s;
	    ch = *s;
	}
	s++ ;
     }
     if( *pe )
     	*(pe + 1) = '\0';
     return  ps;
}
---------
(non lo prendere per oro colato, l'ho scritto come mi veniva in mente, 
neppure provato a compilarlo o seguirne tutti i casi).
Per il compilatore prendine qualcuno di quelli d'uso libero che si 
trovano in rete, tipo quello nel pacchetto di DevC++
 
http://www.bloodshed.net/devcpp.html
Lou

Grazie x la risposta, ma mi è difficile capire i puntatori, non si può
arrivare alla soluzione vedendo la stringa come array di caratteri?


 arrivare alla soluzione vedendo la stringa come array di caratteri?
in quel caso puoi fare un array bidimensionale con tutte le lettere 
dell'alfabeto e a fianco un counter che dice quante volte si presenta e 
dove si presenta la prima volta (tipo se capitano 2 z poi 2 a e poi 4 z la 
salvi nella parte delle z dopodiche' alzi il contatore cosi' z sta a 2 poi 
passa ad a e conta che di a ce ne sono 2 poi ritorna a z e in tal caso 
setti una variabile temporanea poi sommi le z che ci sono e se son maggiori 
delle z presenti nell'array aggiorni il contatore e la parte di contatore 
con l'indice dell'array in cui e' contenuta la stringa) al max fai pure un 
tolower() (#include <string.h> o senno' puoi pure fartelo da solo) prima di 
passarlo alla funzione in cui c'e' l'array tanto poi quando stampi stampi 
con l'indice e la lunghezza della stringa :)
questa e' la prima che mi viene in mente senza puntatori e cose cosi'
spero di essere stato chiaro :)
ciao
Luca
-- 
....~.......xin\@IRCNet (mostly xin\aWAy 24/7 ghgh).../"\
.../V\......Email: xi...@despammed.com................\ /
..// \\.....ICQ UIN: 63088554..........................\
./(   )\........................ASCII Ribbon Campaign./ \
..^`~'^.........................Against HTML Mail and News

 arrivare alla soluzione vedendo la stringa come array di caratteri?
E' esattamente la stessa cosa, cambia solo il modo di riferirsi ai 
caratteri (ci si sposta sui caratteri tramite un indice):
------
char *longest( char *s )
{
     int		ips, ipe;	/* indici prec. di start e end */
     int		ins, ine;	/* indici nuovi di start e end */
     int		i;		/* indice che scorre la stringa */
     char	ch;
     i   = 0;
     ips = ipe = ins = ine = 0;	/* da inizio stringa */
     ch  = s[0];
     while( s[i] != '\0' )
     {
         if( s[i] == ch )
             ine = i;
         else
         {
             if( ipe - ips < ine - ins )
             {
                 ips = ins;
                 ipe = ine;
             }
             ins = i;
             ch = s[i];
         }
         i++ ;
     }
     if( s[ipe] != '\0' )
         s[ipe + 1] = '\0';	/* chiude la stringa più lunga trovata */
     return  &s[ips];
}
------
Se devi approfondire il linguaggio C, ti conviene in ogni caso farti 
un'esperienza con i puntatori, il loro uso non si limita agli array.
In ogni caso, ad un array fai sempre riferimento con un puntatore, anche 
"senza saperlo", perché quando scrivi "s[i]" la variabile "s" è a tutti 
gli effetti un puntatore.
Una comodità, nel caso della funzione sopra, con il puntatore, è che non 
devi usare una variabile indice "i" separata, per scorrere la stringa 
(in modo "comprensibile" nel testo); usando il puntatore, spostandolo 
ogni volta avanti di 1, sposti il punto d'inizio della stringa in 
avanti, facendo riferimento ogni volta al (nuovo) "primo carattere".
Lou

Grazie, spero rispondiate presto
Questo dovrebbe funzionare... l'ho programmato al volo!
#include <stdio.h>
#define LUNG 5
int main(void)
{
char stringa[LUNG+1]="abbbc";
int carcor;
int lungcor;
int maxcor;
int maxlung;
int maxind;
int i;
i=0;
maxcor=0;
maxlung=0;
maxind=0;
while(i<LUNG)
{
        lungcor=0;
        carcor=stringa[i];
        while((carcor == stringa[i]) && (i<10))
        {
                lungcor++;
                i++;
        }
        if (lungcor > maxlung)
        {
                maxlung=lungcor;
                maxcor=carcor;
                maxind=i-maxlung;
        }
}
printf("Sottostringa di caratteri uguali pi— lunga:");
for (i=maxind;i<maxind+maxlung;i++)
        printf("%c",stringa[i]);
printf("\n");
printf("Il carattere %c appare %d volte alla posizione
%d\n",maxcor,maxlung,maxind);
return(0);
}

        while((carcor == stringa[i]) && (i<10))
Azzz..... LUNG va al posto di 10....