For a very specialized concept of fun.
void whatami(char *a, char *b) { while (*a++ = *b++); } int main() { char alpha[5] = "Han", beta[5] = "Solo"; whatami(alpha, beta); }
void whatami(char *a, char *b) { while (*a++ = *b++); } int main() { char alpha[5] = "Han", beta[5] = "Solo"; whatami(alpha, beta); }
Let’s step through it.
void whatami(char *a, char *b) {
while (*a++ = *b++);
}
char alpha[5] = "Han", beta[5] = "Solo";
whatami(alpha, beta);
┌──┐ ┌──┐
a:│ ─┼──┐ b:│ ─┼──┐
└──┘ │ └──┘ │
∨ ∨
┌────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┐
alpha:│ H │ a │ n │ \0 │ ?? │ beta:│ S │ o │ l │ o │ \0 │
└────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┘
First, do the assignment; copy the 'S'
.
void whatami(char *a, char *b) { while (*a++ = *b++); } char alpha[5] = "Han", beta[5] = "Solo"; whatami(alpha, beta); ┌──┐ ┌──┐ a:│ ─┼───────┐ b:│ ─┼───────┐ └──┘ │ └──┘ │ ∨ ∨ ┌────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┐ alpha:│ S │ a │ n │ \0 │ ?? │ beta:│ S │ o │ l │ o │ \0 │ └────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┘
Sometime later (vague), do the post-increments, in any order.
void whatami(char *a, char *b) {
while (*a++ = *b++);
}
char alpha[5] = "Han", beta[5] = "Solo";
whatami(alpha, beta);
┌──┐ ┌──┐
a:│ ─┼───────┐ b:│ ─┼───────┐
└──┘ │ └──┘ │
∨ ∨
┌────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┐
alpha:│ S │ a │ n │ \0 │ ?? │ beta:│ S │ o │ l │ o │ \0 │
└────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┘
Is an assignment true or false?
void whatami(char *a, char *b) { while (*a++ = *b++); } char alpha[5] = "Han", beta[5] = "Solo"; whatami(alpha, beta); ┌──┐ ┌──┐ a:│ ─┼───────┐ b:│ ─┼───────┐ └──┘ │ └──┘ │ ∨ ∨ ┌────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┐ alpha:│ S │ a │ n │ \0 │ ?? │ beta:│ S │ o │ l │ o │ \0 │ └────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┘
void whatami(char *a, char *b) { while (*a++ = *b++); } char alpha[5] = "Han", beta[5] = "Solo"; whatami(alpha, beta); ┌──┐ ┌──┐ a:│ ─┼───────┐ b:│ ─┼───────┐ └──┘ │ └──┘ │ ∨ ∨ ┌────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┐ alpha:│ S │ a │ n │ \0 │ ?? │ beta:│ S │ o │ l │ o │ \0 │ └────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┘
void whatami(char *a, char *b) { while (*a++ = *b++); } char alpha[5] = "Han", beta[5] = "Solo"; whatami(alpha, beta); ┌──┐ ┌──┐ a:│ ─┼────────────┐ b:│ ─┼────────────┐ └──┘ │ └──┘ │ ∨ ∨ ┌────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┐ alpha:│ S │ o │ n │ \0 │ ?? │ beta:│ S │ o │ l │ o │ \0 │ └────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┘
void whatami(char *a, char *b) { while (*a++ = *b++); } char alpha[5] = "Han", beta[5] = "Solo"; whatami(alpha, beta); ┌──┐ ┌──┐ a:│ ─┼─────────────────┐ b:│ ─┼─────────────────┐ └──┘ │ └──┘ │ ∨ ∨ ┌────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┐ alpha:│ S │ o │ l │ \0 │ ?? │ beta:│ S │ o │ l │ o │ \0 │ └────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┘
void whatami(char *a, char *b) { while (*a++ = *b++); } char alpha[5] = "Han", beta[5] = "Solo"; whatami(alpha, beta); ┌──┐ ┌──┐ a:│ ─┼──────────────────────┐ b:│ ─┼──────────────────────┐ └──┘ │ └──┘ │ ∨ ∨ ┌────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┐ alpha:│ S │ o │ l │ o │ ?? │ beta:│ S │ o │ l │ o │ \0 │ └────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┘
void whatami(char *a, char *b) { while (*a++ = *b++); } char alpha[5] = "Han", beta[5] = "Solo"; whatami(alpha, beta); ┌──┐ ┌──┐ a:│ ─┼───────────────────────────┐ b:│ ─┼───────────────────────────┐ └──┘ │ └──┘ │ ∨ ∨ ┌────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┐ alpha:│ S │ o │ l │ o │ \0 │ beta:│ S │ o │ l │ o │ \0 │ └────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┘
Finally, we copy the '\0'
. Is it true or false?
void whatami(char *a, char *b) { while (*a) a++; while (*a++ = *b++); }
so … it’s strcpy
!
#include <string.h>
strchr(char *s, char c);
c
in s
strstr(char *haystack, char *needle);
needle
in the haystack