Houjun Liu


In C, string is an array of chars. C strings don’t track their length; each C string always end in an null-terminating character: \0. This is represents the zero byte.

There’s a built in function strlen which checks the length of a string without the null-terminating character. This function is O(n)!!!

String Pointer Syntax Sugar Synonyms

char str[6];

// these are equivalent
char *ptr = str;
char *ptr = &str[0];
char *ptr = &str; // DON'T DO THIS

// these are equivalent
char thirdLetter = str[3];
char thirdLetter = *(str + 3);

seven commandments of c strings

  1. if we create a string as char[], we can modify its characters because its memory lives in our stack instead of living in a global data segment
  2. we can’t set char[] as equaling to something, because its not strictly a pointer and instead it refers to an entire block of memory instead of a pointer to the first element (in a same vein, an array’s size is fixed and travels with the variable)
  3. if we pass char[] as a parameter, it is converted to a char *
  4. if we create a string with new string literal as char *thing = "thing", we can’t modify it because its on the global data segment
  5. we can set char * equaling to another value because its a pointer
  6. adding an offset to a c string gives a substring that’s places past the first character
  7. if we change characters in a string parameter, these changes will persist

passing strings around

Strings are passed as a pointer to their first character.

void foo(char *str) {
    // do string things

char string[6]; // THIS IS A STRING OF LENGTH 5!!!! (beacuse there's a null terminator)
foo(string); // pass the syntax sugar pointer
foo(&string[0]); // pass the actual first pointer

you won’t know whether or not this is the address to a string or a pointer to a single character; so good practice to call it something_str if you’d like a string.

character manipulation checker

#include <ctype.h>

int main() {

string manipulations

#include <string.h>


When you comparing strings, you can’t use == or < or >. Instead:

#include <string.h>

int main() {
    int cmp = strcmp(str1, str2);

    if (cmp == 0) {
        // if str1 is equal to str2
    } else if (cmp < 0) {
        // if str1 comes before str2 lexographically
    } else {
        // if str2 comes before str1 lexographically



Copying strings, dangerously, because buffer overflows are fun.

This function does NOT care about buffer overflows, and WILL put in a null terminator.


This function optimize against buffer overflow, but it may not write a null terminator.


strncat always puts in a null terminator.

pointer arithmetic with strings

Fortunatly, each char is


Count the number of characters that are “cool”: contained within the end