diff --git a/src/core/support/string.c b/src/core/support/string.c
index f85f656da4368619c75c5baf6f6a37e7988e2443..8f59945c59af16ed4e15d0acd70d1333cbe005cc 100644
--- a/src/core/support/string.c
+++ b/src/core/support/string.c
@@ -173,12 +173,12 @@ char *gpr_strjoin_sep(const char **strs, size_t nstrs, const char *sep,
   out_length = 0;
   for (i = 0; i < nstrs; i++) {
     const size_t slen = strlen(strs[i]);
-    memcpy(out + out_length, strs[i], slen);
-    out_length += slen;
-    if (sep_len > 0 && nstrs > 0 && i < nstrs - 1) {
+    if (i != 0) {
       memcpy(out + out_length, sep, sep_len);
       out_length += sep_len;
     }
+    memcpy(out + out_length, strs[i], slen);
+    out_length += slen;
   }
   out[out_length] = 0;
   if (final_length != NULL) {
diff --git a/test/core/support/string_test.c b/test/core/support/string_test.c
index 24e28d68dd61dfd569639055883895f313cfab77..30d97de1a534e2461986a5080c9f4e68b0955c05 100644
--- a/test/core/support/string_test.c
+++ b/test/core/support/string_test.c
@@ -176,10 +176,17 @@ static void test_strjoin_sep(void) {
   GPR_ASSERT(0 == strcmp("one, two, three, four", joined));
   gpr_free(joined);
 
+  /* empty separator */
+  joined = gpr_strjoin_sep(parts, 4, "", &joined_len);
+  GPR_ASSERT(0 == strcmp("onetwothreefour", joined));
+  gpr_free(joined);
+
+  /* degenerated case specifying zero input parts */
   joined = gpr_strjoin_sep(parts, 0, ", ", &joined_len);
   GPR_ASSERT(0 == strcmp("", joined));
   gpr_free(joined);
 
+  /* single part should have no separator */
   joined = gpr_strjoin_sep(parts, 1, ", ", &joined_len);
   GPR_ASSERT(0 == strcmp("one", joined));
   gpr_free(joined);