Comparing null-terminated string with a non null-terminated string in C

后端 未结 3 833
渐次进展
渐次进展 2021-01-25 02:46

The deserialization library (messagepack) I am using does not provide null-terminated strings. Instead, I get a pointer to the beginning of the string and a length. What is the

相关标签:
3条回答
  • 2021-01-25 03:14

    The fastest way is strncmp() which limits the length to be compared.

     if (strncmp(sa, sb, length)==0)  
        ...
    

    This assumes however that the length you use is the maximum length of the two strings. If the null terminated string could have a bigger length, you first have to compare the length.

     if(strncmp(sa,sb, length)==0 && strlen(sa)<=length) // sa being the null terminated one
         ...
    

    Note that the strlen() is checked on purpose after the comparison, to avoid unnecessarily iterating through all the characters o fthe null terminated string if the first caracters don't even match.

    A final variant is:

     if(strncmp(sa,sb, length)==0 && sa[length]==0) // sa being the null terminated one
         ...
    
    0 讨论(0)
  • 2021-01-25 03:24
    int compare(char *one, size_t onelen, char *two, size_t twolen)
    {
    int dif;
    
      dif = memcmp(one, two, onelen < twolen ? onelen : twolen);
      if (dif) return dif;
    
      if (onelen == twolen) return 0;
      return onelen > twolen? 1 : -1;
    }
    

    usage:

    ...
    int result;
    char einz[4] = "einz"; // not terminated
    char *zwei = "einz";   // terminated
    
    result = compare(einz, sizeof einz, zwei, strlen(zwei));
    
    ...
    
    0 讨论(0)
  • 2021-01-25 03:28

    Here is one way:

    bool is_same_string(char const *s1, char const *s2, size_t s2_len)
    {
        char const *s2_end = s2 + s2_len;
        for (;;)
        {
            if ( s1[0] == 0 || s2 == s2_end )
                return s1[0] == 0 && s2 == s2_end;
    
            if ( *s1++ != *s2++ )
                return false;
        }
    }
    
    0 讨论(0)
提交回复
热议问题