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