Re: strcpy versus strncpy

From: Chris L. Mason (cmasonat_private)
Date: Tue Mar 03 1998 - 20:38:18 PST

  • Next message: Aleph One: "(no subject)"

    >
    > It is kalled SIGSEGV ...
    > Because strlen is simply an
    > size_t i; char *string;
    > for(i=0;*(string+i)!='\0';i++);
    > return i;
    >
    > And when (string+1) points outside the space allocated .. well .. possible
    > it doesn't find a '\0' there .. possible it don't even can read it ..
    >
    > And thats why you can't do that.
    
    Good point.  Here's a revised version (also incorporating other suggestions
    made)
    
    size_t sstrlen(const char *s, size_t n) {
        size_t  i;
    
        for(i = 0; (*(s+i) != '\0' && i < n); i++);
    
            return i;
    }
    
    char *sstrncpy(char *dst, size_t n1, const char *src, size_t n2) {
        if (sstrlen(src, n2) > (n1 - 1)) {
            errno = ENOSPC;
            dst[0] = NULL;
            return NULL;
        }
    
        strncpy(dst, src, n2);
    
        return dst;
    }
    
    Something similar could be done with strncat as well.  Note that I
    don't return the number of bytes written because I wanted to remain
    consistent with the existing strncpy.
    
    
    Chris
    



    This archive was generated by hypermail 2b30 : Fri Apr 13 2001 - 13:44:00 PDT