How do I trim leading/trailing whitespace in a standard way?

后端 未结 30 2019
一个人的身影
一个人的身影 2020-11-22 02:06

Is there a clean, preferably standard method of trimming leading and trailing whitespace from a string in C? I\'d roll my own, but I would think this is a common problem wit

30条回答
  •  再見小時候
    2020-11-22 02:27

    If you can modify the string:

    // Note: This function returns a pointer to a substring of the original string.
    // If the given string was allocated dynamically, the caller must not overwrite
    // that pointer with the returned value, since the original pointer must be
    // deallocated using the same allocator with which it was allocated.  The return
    // value must NOT be deallocated using free() etc.
    char *trimwhitespace(char *str)
    {
      char *end;
    
      // Trim leading space
      while(isspace((unsigned char)*str)) str++;
    
      if(*str == 0)  // All spaces?
        return str;
    
      // Trim trailing space
      end = str + strlen(str) - 1;
      while(end > str && isspace((unsigned char)*end)) end--;
    
      // Write new null terminator character
      end[1] = '\0';
    
      return str;
    }
    

    If you can't modify the string, then you can use basically the same method:

    // Stores the trimmed input string into the given output buffer, which must be
    // large enough to store the result.  If it is too small, the output is
    // truncated.
    size_t trimwhitespace(char *out, size_t len, const char *str)
    {
      if(len == 0)
        return 0;
    
      const char *end;
      size_t out_size;
    
      // Trim leading space
      while(isspace((unsigned char)*str)) str++;
    
      if(*str == 0)  // All spaces?
      {
        *out = 0;
        return 1;
      }
    
      // Trim trailing space
      end = str + strlen(str) - 1;
      while(end > str && isspace((unsigned char)*end)) end--;
      end++;
    
      // Set output size to minimum of trimmed string length and buffer size minus 1
      out_size = (end - str) < len-1 ? (end - str) : len-1;
    
      // Copy trimmed string and add null terminator
      memcpy(out, str, out_size);
      out[out_size] = 0;
    
      return out_size;
    }
    

提交回复
热议问题