[C] Concatenare due stringhe utilizzando i puntatori

di il
17 risposte

[C] Concatenare due stringhe utilizzando i puntatori

Hola!
Sto cercando di implementare una funzione strcat per concatenare due stringhe (char *string) utilizzando solo le primitive del C e con i puntatori. La funzione che ho implementato io mi da problemi durante il runtime. Potete dirmi dove ho sbagliato?

char *strcat2(char *dest, const char *src)
{
	while(*dest++)
		; 
	while( (*dest++ = *src++) ) 
		;      
        return dest;
}

17 Risposte

  • Re: [C] Concatenare due stringhe utilizzando i puntatori

    Haloa spaccaversi7,

    - Il primo loop si ferma dopo lo zero finale, dovrebbe fermasi sullo zero.
    - strcat2 dovrebbe restituire un puntatore all' inizio di dest, ora restituisce il puntatore alla fine.
  • Re: [C] Concatenare due stringhe utilizzando i puntatori

    Grazie barba59
    ho modificato la funzione come segue, ma credo di aver sbagliato di nuovo qualcosa :/
    
    char *strcat2(char *dest, const char *src)
    {
    	char *temp = &dest;
    	while(*dest != '\0')
    		*dest++; 
    	while( (*dest++ = *src++) ) 
    		;    
    	return temp;
    }
    
  • Re: [C] Concatenare due stringhe utilizzando i puntatori

    Su, è solo una piccola svista, direi che ora ci siamo:
    
    char *strcat2(char *dest, const char *src)
    {
       char* temp = dest;
       while(*dest)
    	   dest++;
    
       while( (*dest++ = *src++) ) 
          ;      
       return temp;
    }
    
  • Re: [C] Concatenare due stringhe utilizzando i puntatori

    Mmh in runtime continua a dirmi:
    Errore di segmentazione (core dump creato)
    
    Ecco tutto il file [main.c]
    
    #include<stdio.h>
    
    char *strcpy(char *, const char *);
    char *strcat2(char *dest, const char *src);
    int strcmp(char *str1, char *str2);
    int strlen(const char *);
    
    main(){
    	char *a = "Hello ", *b = "World!";
    	printf("[%s]\n", a);
    	printf("[%s]\n", b);
    	printf("Ris [%s]\n", strcat2(a,b));
    	return 0;
    }
    
    int strlen(const char *str){
    	int counter;
    	for(counter = 0; str[counter] != '\0'; counter++)
    		;
    	return counter;
    }
    
    int strcmp(char *str1, char *str2)
    {
    	int count1, count2;
    	count1 = strlen(str1);
    	count2 = strlen(str2);
    	if(count1 < count2) return -1;
    	else if(count1 == count2) return 0;
    	else return 1;
    }
    
    char *strcat2(char *dest, const char *src)
    {
       char* temp = dest;
       while(*dest)
          dest++;
    
       while( (*dest++ = *src++) ) 
          ;      
       return temp;
    }
    
    char *strcpy(char *dest, const char *src)
    {
    	int i = 0;
    	for(i=0; dest[i] = src[i]; i++)
    		;
    }
    
    l'output del programma è:
    
    spaccaversi@ubuntu:~/codici/c$ ./a.out 
    [Hello ]
    [World!]
    Errore di segmentazione (core dump creato)
    
  • Re: [C] Concatenare due stringhe utilizzando i puntatori

    Adesso la funzione strcat2 è a posto. Come la strcat originale è una funzione pericolosa da usare, non effettua controlli, se le passi i puntatori sbagliati combina un casino.

    Giusto per rendere la cosa più divertente prova a vedere se ti bastano queste indicazioni per trovare l' errore. Comunque io sono qui, se serve fa un fischio.
  • Re: [C] Concatenare due stringhe utilizzando i puntatori

    Fatto!!! Grazie barba59

    ho modificato così:
    
    	char a[] = "Hello ";
    	char b[] = "World!";
    
    E ora funziona! Era questa la soluzioni a cui avevi pensato?
  • Re: [C] Concatenare due stringhe utilizzando i puntatori

    Ciao spaccaversi7

    No, è ancora sbagliato, anzi sbagliatissimo . È un errore piuttosto frequente in C.
    Prova a considerare questo: se tu concateni le stringhe "Hello " e Word!" il risultato è una stringa di 11 caratteri più lo zero. La destinazione deve essere abbastanza grande da contenere il risultato.

    Quando scrivi char a[] = "Hello "; dichiari un array lungo 6 caratteri + lo zero che non è sufficiente a contenere il risultato.
  • Re: [C] Concatenare due stringhe utilizzando i puntatori

    È verooo! Che sbadato! Infatti cambiando le stringhe a e b mi dava il risultato giusto e poi mi scriveva un messaggio di errore di stack. Ora cerco di risolvere.
  • Re: [C] Concatenare due stringhe utilizzando i puntatori

    Tra l' altro questo tipo di errori sono quelli più difficili da trovare, ad esempio il tuo codice di prima non dava nessun errore, quindi tu avresti consegnato il programma convinto che fosse corretto, poi basta una piccola modifica, magari da qualche altra parte nel programma per far comparire l' errore, e tu non capisci più niente.
  • Re: [C] Concatenare due stringhe utilizzando i puntatori

    Il fatto è che io vengo dal C++ (sì lo so è strano xD) e sono abituato ad usare string e vector del c++.
    E ho studiato tutto per autodidatta
    Ho impostato una dimensione standard per i due array così:
    
    	char a[80] = "Hello \0";
    	char b[80] = "World! Mondo\0";
    
    Ho fatto un po' di prove e non ha dato problemi. Cosa ne pensi?
  • Re: [C] Concatenare due stringhe utilizzando i puntatori

    Penso che intanto ti capisco perfettamente pure io sono abituato ad usare il C++ o il C# e quando ci sono questi giochini coi puntatori devo starci attento. E poi penso che adesso il tuo programma e giusto
  • Re: [C] Concatenare due stringhe utilizzando i puntatori

    Siamo d'accordo! Le altre funzioni sono corrette? Poi ho intenzione di implementare anche memcpy e memset alla stessa maniera
  • Re: [C] Concatenare due stringhe utilizzando i puntatori

    - devi dichiarare 'int main()' (alcuni compilatori protestano)
    - la strcpy non restituisce il valore.
    - la strcmp dovrebbe fare un confronto alfabetico tra le stringe, non confrontare le lunghezze.
  • Re: [C] Concatenare due stringhe utilizzando i puntatori

    Ho corretto i tre errori e ho cominciato memcopy
    
    #include<stdio.h>
    
    typedef unsigned int size_t;
    
    char *mstrcpy(char *, const char *);
    char *mstrcat(char *dest, const char *src);
    int mstrcmp(char *str1, char *str2);
    int mstrlen(const char *);
    
    void *memcopy(void *dest, const void *src, size_t n);
    
    int main(){
    	char a[80] = "Hello \0";
    	char b[80] = "World!\0";
    	printf("cmp [%d]\n", mstrcmp(a,b));
    	printf("[%s]\n", a);
    	printf("[%s]\n", b);
    	mstrcpy(a,b);
    	printf("Ris [%s]\n", mstrcat(a,b));
    	printf("cmp [%d]\n", mstrcmp(a,b));
    	return 0;
    }
    
    void *memcopy(void *dest, const void *src, size_t n)
    {
    	char *p=(char *) dest;
    	const char *s=(const char *) src;
    	
    	while(n>1){
    		*p++=*s++;
    		--n;
    	}
    	return dest;
    }
    
    
    int mstrlen(const char *str){
    	int counter;
    	for(counter = 0; str[counter] != '\0'; counter++)
    		;
    	return counter;
    }
    
    int mstrcmp(char *str1, char *str2)
    {
        for(;*str1 && *str2 && *str1==*str2;str1++,str2++)
            ;
        return (int)*((unsigned char *)str1)-(int)*((unsigned char *)str2);
    }
    
    char *mstrcat(char *dest, const char *src)
    {
       char* temp = dest;
       while(*dest)
          dest++;
    
       while( (*dest++ = *src++) ) 
          ;      
       return temp;
    }
    
    char *mstrcpy(char *dest, const char *src)
    {
    	int i = 0;
    	for(i=0; dest[i] = src[i]; i++)
    		;
    	return dest;
    }
    
Devi accedere o registrarti per scrivere nel forum
17 risposte