Pagina 1 di 6 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 52
  1. #1

    [C] Strcat... Cosa Sbaglio...?

    Sto' tentando di rifare la strcat con il controllo sulla memoria (se ho abbastanza memoria per copiare str2 dopo str1) ma ho qualche problema e non riesco a capire dove...

    Potete Aiutarmi...

    size_t e' un unsigned int....

    codice:
    char *cat(char *str1, const char *str2) {
       size_t mem_str1 = sizeof(str1);
       size_t end_str1 = strlen(str1);
       size_t mem_nec = (end_str1 + strlen(str2))*sizeof(char);
    
       /* Not Enough Memory */
       if (mem_nec > mem_str1) {
          return (NULL);		
       }
    
       /* Concat Strings */
       while ((*(str1 + end_str1) = *str2) != '\0') {
          str1++;
          str2++;
       }
       *(str1+1) = '\0';
       
       return ((char *)str1);
    };
    Altra cosa... se faccio stampare il sizeof(str1) nella funzione ho un byte in piu' rispetto alla stringa che definisco 'nel main'...
    Come mai ???
    PoWered by:
    Gentoo 1.5.3 - Kernel 2.6.7
    Debian Sid - Kernel 2.6.7 - Bash 3.0
    Slackware current - Kernel 2.6.7

  2. #2
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Sai almeno come funziona sizeof() ?

    Non mi sembra che abbia molto senso sizeof(str1)...

  3. #3
    come come funziona ???
    ritorna la quantita' di memoria di una variabile...

    ma se io nel main ho
    char str[3];
    printf ("%d", sizeof(str));

    mi ritorna/stampa 3 mentre nella funzione 4...

    Perche' ???
    PoWered by:
    Gentoo 1.5.3 - Kernel 2.6.7
    Debian Sid - Kernel 2.6.7 - Bash 3.0
    Slackware current - Kernel 2.6.7

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Non ho capito una parte del tuo codice:
    codice:
    size_t mem_nec = (end_str1 + strlen(str2))*sizeof(char);
    
    if (mem_nec > mem_str1) {
       return (NULL);		
    }
    Dato che mem_str1 è la lunghezza di str1 sarà sempre minore della somma data da se stesso + la lunghezza di un'altra stringa (a meno che la seconda stringa non sia nulla). Tantopiù che confronti il valore di una lunghezza di una stringa con un valore di [i]memoria occupata[/b] da una stringa, nettamente più lunga.

    Il byte in più che ti viene restituito, probabilmente, è il terminatore NULL, che viene sottointeso nelle stringhe fisse:
    codice:
    char *miaStringa = "Ciao";
    
    equivale a
    
    |--------------------|
    | C | I | A | O | \0 |
    |--------------------|
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    nonono!

    codice:
    char str[50];
    cout << sizeof(str);
    restituisce il numero di byte occupati da un puntatore a carattere (cioè str), quindi sul mio computer 4.


  6. #6
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Originariamente inviato da LeleFT
    Non ho capito una parte del tuo codice:
    codice:
    size_t mem_nec = (end_str1 + strlen(str2))*sizeof(char);
    
    if (mem_nec > mem_str1) {
       return (NULL);		
    }
    Dato che mem_str1 è la lunghezza di str1 sarà sempre minore della somma data da se stesso + la lunghezza di un'altra stringa (a meno che la seconda stringa non sia nulla). Tantopiù che confronti il valore di una lunghezza di una stringa con un valore di [i]memoria occupata
    da una stringa, nettamente più lunga.

    Il byte in più che ti viene restituito, probabilmente, è il terminatore NULL, che viene sottointeso nelle stringhe fisse:
    codice:
    char *miaStringa = "Ciao";
    
    equivale a
    
    |--------------------|
    | C | I | A | O | \0 |
    |--------------------|
    Ciao. [/B]
    A me pare che strlen() non conti il carattere terminatore nullo... :master:

  7. #7

    x LeleFT

    ma se io ho nel main la stringa str1 con 22 componenti
    (22 byte visto che un char +- vale 1)

    quando faccio il sizeof(str1) dovrei ottenere 22
    PoWered by:
    Gentoo 1.5.3 - Kernel 2.6.7
    Debian Sid - Kernel 2.6.7 - Bash 3.0
    Slackware current - Kernel 2.6.7

  8. #8
    sizeof prende la dim del tipo nn dell'istanza dell'oggetto
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  9. #9
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Originariamente inviato da Luc@s
    sizeof prende la dim del tipo nn dell'istanza dell'oggetto
    Infatti, bisogna ricordare che sizeof() agisce in fase di compilazione!

  10. #10
    e perche' io facendo mi trovo 22 ???
    codice:
    #include <stdio.h>
    
    int main() {
       char str[22] = "Ciao";
       
       printf ("Sizeof (str) %u \n", sizeof(str));
       
       getchar();
       return 0;
    }

    Dev C++ 4.9.8.7
    PoWered by:
    Gentoo 1.5.3 - Kernel 2.6.7
    Debian Sid - Kernel 2.6.7 - Bash 3.0
    Slackware current - Kernel 2.6.7

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.