An array of strings is a two-dimensional array of characters where each row stores one string. Alternatively, it can be an array of pointers to strings.
Two Ways to Create Array of Strings
| Method | Syntax | Memory Location | Can Modify? |
|---|---|---|---|
| 2D char array | char names[3][20] | Stack/Data segment | Yes |
| Array of pointers | char *names[3] | Pointers on stack, strings in read-only memory | Depends |
Method 1: 2D Character Array (Fixed Size)
#include <stdio.h>
int main() {
// 3 strings, each max 20 characters (including null terminator)
char fruits[3][20] = {
"Apple",
"Banana",
"Cherry"
};
// Accessing and printing
printf("First fruit: %s\n", fruits[0]);
printf("Second fruit: %s\n", fruits[1]);
printf("Third fruit: %s\n", fruits[2]);
return 0;
}
Output:
First fruit: Apple Second fruit: Banana Third fruit: Cherry
Method 2: Array of Pointers (Flexible)
#include <stdio.h>
int main() {
// Array of pointers to string literals
char *colors[] = {
"Red",
"Green",
"Blue",
"Yellow"
};
int size = sizeof(colors) / sizeof(colors[0]);
for(int i = 0; i < size; i++) {
printf("%s\n", colors[i]);
}
return 0;
}
Output:
Red Green Blue Yellow
Example 1: Loop Through All Strings
#include <stdio.h>
int main() {
char cities[4][15] = {
"New York",
"London",
"Tokyo",
"Paris"
};
int rows = 4;
for(int i = 0; i < rows; i++) {
printf("City %d: %s\n", i + 1, cities[i]);
}
return 0;
}
Output:
City 1: New York City 2: London City 3: Tokyo City 4: Paris
Example 2: User Input into String Array
#include <stdio.h>
int main() {
char names[5][50];
printf("Enter 5 names:\n");
for(int i = 0; i < 5; i++) {
printf("Name %d: ", i + 1);
fgets(names[i], 50, stdin); // Read with spaces
// Remove newline character if present
size_t len = strlen(names[i]);
if(len > 0 && names[i][len-1] == '\n') {
names[i][len-1] = '\0';
}
}
printf("\nYou entered:\n");
for(int i = 0; i < 5; i++) {
printf("Name %d: %s\n", i + 1, names[i]);
}
return 0;
}
Example 3: Modify Strings in Array
#include <stdio.h>
#include <string.h>
int main() {
char words[3][20] = {
"Hello",
"World",
"Coding"
};
printf("Before modification:\n");
for(int i = 0; i < 3; i++) {
printf("%s\n", words[i]);
}
// Modify strings
strcpy(words[0], "Hi");
strcpy(words[1], "Universe");
strcat(words[2], " is fun");
printf("\nAfter modification:\n");
for(int i = 0; i < 3; i++) {
printf("%s\n", words[i]);
}
return 0;
}
Output:
Before modification: Hello World Coding After modification: Hi Universe Coding is fun
Example 4: Passing Array of Strings to Function
#include <stdio.h>
#include <string.h>
void printStrings(char arr[][20], int rows) {
for(int i = 0; i < rows; i++) {
printf("%s\n", arr[i]);
}
}
void convertToUpper(char arr[][20], int rows) {
for(int i = 0; i < rows; i++) {
for(int j = 0; arr[i][j]; j++) {
if(arr[i][j] >= 'a' && arr[i][j] <= 'z') {
arr[i][j] = arr[i][j] - 32;
}
}
}
}
int main() {
char words[3][20] = {
"apple",
"banana",
"cherry"
};
printf("Original:\n");
printStrings(words, 3);
convertToUpper(words, 3);
printf("\nUppercase:\n");
printStrings(words, 3);
return 0;
}
Output:
Original: apple banana cherry Uppercase: APPLE BANANA CHERRY
Example 5: Sorting Array of Strings
#include <stdio.h>
#include <string.h>
void sortStrings(char arr[][50], int count) {
char temp[50];
for(int i = 0; i < count - 1; i++) {
for(int j = i + 1; j < count; j++) {
if(strcmp(arr[i], arr[j]) > 0) {
// Swap strings
strcpy(temp, arr[i]);
strcpy(arr[i], arr[j]);
strcpy(arr[j], temp);
}
}
}
}
int main() {
char fruits[5][50] = {
"Mango",
"Apple",
"Grape",
"Banana",
"Cherry"
};
printf("Before sorting:\n");
for(int i = 0; i < 5; i++) {
printf("%s\n", fruits[i]);
}
sortStrings(fruits, 5);
printf("\nAfter sorting:\n");
for(int i = 0; i < 5; i++) {
printf("%s\n", fruits[i]);
}
return 0;
}
Output:
Before sorting: Mango Apple Grape Banana Cherry After sorting: Apple Banana Cherry Grape Mango
Example 6: Array of Pointers (String Literals)
#include <stdio.h>
int main() {
// String literals - stored in read-only memory
char *months[] = {
"January",
"February",
"March",
"April",
"May",
"June"
};
int size = 6;
printf("Months of the year:\n");
for(int i = 0; i < size; i++) {
printf("%d. %s\n", i + 1, months[i]);
}
// months[0][0] = 'J'; // â WRONG - Cannot modify string literal
return 0;
}
Output:
Months of the year: 1. January 2. February 3. March 4. April 5. May 6. June
Memory Comparison
// Method 1: 2D Array - Memory allocated contiguously
char arr1[3][10] = {"One", "Two", "Three"};
// Memory layout:
// [O][n][e][\0][ ][ ][ ][ ][ ][ ]
// [T][w][o][\0][ ][ ][ ][ ][ ][ ]
// [T][h][r][e][e][\0][ ][ ][ ][ ]
// Method 2: Array of Pointers
char *arr2[3] = {"One", "Two", "Three"};
// Memory layout:
// arr2[0] â "One" (somewhere in read-only memory)
// arr2[1] â "Two"
// arr2[2] â "Three"
String Array Operations Table
| Operation | Code | Notes |
|---|---|---|
| Declare 2D array | char arr[10][50] | 10 strings, max 49 chars each |
| Declare pointer array | char *arr[10] | 10 pointers to strings |
| Access string | arr[i] | Returns entire string |
| Access character | arr[i][j] | Returns single character |
| Copy string | strcpy(arr[i], "text") | Use for 2D arrays |
| Compare strings | strcmp(arr[i], arr[j]) | Returns 0 if equal |
| Get string length | strlen(arr[i]) | Length without null terminator |
| Input with spaces | fgets(arr[i], size, stdin) | Safer than scanf |
Common Mistakes
// â WRONG - No space for null terminator
char arr[3][5] = {"Hello", "World"}; // "Hello" needs 6 bytes (5+1)
// â
CORRECT - Always allocate extra space
char arr[3][10] = {"Hello", "World"};
// â WRONG - Trying to modify string literal
char *ptr[] = {"Apple", "Banana"};
ptr[0][0] = 'a'; // CRASH - String literal is read-only
// â
CORRECT - Use 2D array for modifiable strings
char arr[2][10] = {"Apple", "Banana"};
arr[0][0] = 'a'; // Works fine
// â WRONG - Forgetting & in scanf
char names[5][20];
scanf("%s", names[0]); // â
Correct (array name is address)
scanf("%s", &names[0]); // Also works but & is optional
// â
CORRECT - fgets is safer
fgets(names[0], 20, stdin);
When to Use Each Method
| Use Case | Recommended Method | Reason |
|---|---|---|
| Need to modify strings | 2D char array char arr[10][50] | Strings are modifiable |
| Fixed list of constants | Array of pointers char *arr[] | Saves memory |
| Unknown string lengths | Array of pointers + dynamic allocation | More flexible |
| Pass to functions | Either works | Depends on needs |
| Small embedded systems | 2D char array | Fixed, predictable memory |
Quick Summary
| Concept | Syntax | Example |
|---|---|---|
| Declare 2D array | char arr[rows][cols] | char names[5][50] |
| Declare pointer array | char *arr[size] | char *colors[10] |
| Access string | arr[i] | printf("%s", names[2]) |
| Access character | arr[i][j] | char ch = names[0][1] |
| Loop through | for(i=0; i<rows; i++) | Iterate all strings |
| String input | fgets(arr[i], size, stdin) | Safe input |
| String copy | strcpy(arr[i], source) | Use for 2D arrays |
Complete C Programming Guide + Compilers Collection
1. C srand() Function â Understanding Seed Initialization
https://macronepal.com/understanding-the-c-srand-function
Explains how srand() initializes the pseudo-random number generator in C by setting a seed value. Using the same seed produces the same sequence, while time(NULL) gives different results each run.
2. C rand() Function Mechanics and Limitations
https://macronepal.com/c-rand-function-mechanics-and-limitations
Explains how rand() generates pseudo-random numbers between 0 and RAND_MAX, its deterministic nature, and limitations for security use cases.
3. C log() Function
https://macronepal.com/c-log-function-2
Covers natural logarithm calculation using <math.h> and its applications.
4. Mastering Date and Time in C
https://macronepal.com/mastering-date-and-time-in-c
Explains <time.h> functions like time(), clock(), difftime(), and struct tm.
5. Mastering time_t Type in C
https://macronepal.com/mastering-the-c-time_t-type-for-time-management
Explains time representation as seconds since Unix epoch and conversion functions.
6. C exp() Function
https://macronepal.com/c-exp-function-mechanics-and-implementation
Explains exponential function exp(x) and its scientific applications.
7. C log() Function (Alternate Guide)
https://macronepal.com/c-log-function
Comparison of log() and log10() with usage examples.
8. C log10() Function
https://macronepal.com/mastering-the-log10-function-in-c
Explains base-10 logarithm for engineering and scientific applications.
9. C tan() Function
https://macronepal.com/understanding-the-c-tan-function
Explains tangent function and radian-based calculations.
10. Random Numbers in C (Secure vs Predictable)
https://macronepal.com/mastering-c-random-numbers-for-secure-and-predictable-applications
Explains difference between rand() and secure randomness methods.
11. Free Online C Compiler
https://macronepal.com/free-online-c-code-compiler-2
Browser-based compiler for testing C programs instantly.
C Functions, Arguments, Parameters & Flow
Mastering Functions in C â Complete Guide
https://macronepal.com/c/mastering-functions-in-c-a-complete-guide/
Covers function structure, modular programming, and real-world usage.
Function Arguments in C
https://macronepal.com/c-function-arguments/
Explains how arguments are passed and used in function calls.
Function Parameters in C
https://macronepal.com/c-function-parameters/
Explains defining inputs for functions and matching them with arguments.
Function Declarations in C
https://macronepal.com/c-function-declarations-syntax-rules-and-best-practices/
Covers prototypes, syntax rules, and best practices.
Function Calls in C
https://macronepal.com/understanding-function-calls-in-c-syntax-mechanics-and-best-practices/
Explains execution flow and parameter handling during function calls.
Void Functions in C
https://macronepal.com/understanding-void-functions-in-c-syntax-patterns-and-best-practices/
Explains functions that do not return values.
Return Values in C
https://macronepal.com/c-return-values-mechanics-types-and-best-practices/
Explains different return types and how functions return results.
Pass-by-Value in C
https://macronepal.com/aws/understanding-pass-by-value-in-c-mechanics-implications-and-best-practices/
Explains how copies of variables are passed into functions.
Pass-by-Reference in C
https://macronepal.com/c/understanding-pass-by-reference-in-c-pointers-semantics-and-safe-practices/
Explains using pointers to modify original variables.
C strstr() Function
https://macronepal.com/aws/c-strstr-function/
Explains substring search inside strings in C.
C Preprocessor & Macros
https://macronepal.com/mastering-c-variadic-macros-for-flexible-debugging/
https://macronepal.com/mastering-the-stdc-macro-in-c/
https://macronepal.com/c-time-macro-mechanics-and-usage/
https://macronepal.com/understanding-the-c-date-macro/
https://macronepal.com/c-file-type/
https://macronepal.com/mastering-c-line-macro-for-debugging-and-diagnostics/
https://macronepal.com/mastering-predefined-macros-in-c/
https://macronepal.com/c-error-directive-mechanics-and-usage/
https://macronepal.com/understanding-the-c-pragma-directive/
https://macronepal.com/c-include-directive/
C Structures, Memory, Scope & Linkage
https://macronepal.com/mastering-structures-in-c/
https://macronepal.com/c-structure-declaration-mechanics-and-usage/
https://macronepal.com/c-structure-initialization-mechanics-and-best-practices/
https://macronepal.com/mastering-c-structure-member-access-for-reliable-data-handling/
https://macronepal.com/c-nested-structures/
https://macronepal.com/mastering-arrays-of-structures-in-c/
https://macronepal.com/c-structure-pointers-mechanics-and-implementation/
https://macronepal.com/understanding-c-structure-parameter-passing-mechanics/
https://macronepal.com/mastering-c-returning-structures-for-efficient-data-flow/
https://macronepal.com/c-self-referential-structures/
https://macronepal.com/mastering-structure-alignment-in-c/
https://macronepal.com/c-structure-padding-mechanics-and-optimization/
https://macronepal.com/understanding-c-flexible-array-members-mechanics-and-usage/
https://macronepal.com/mastering-c-anonymous-structures-for-flattened-data-layouts/
https://macronepal.com/c-unions/
https://macronepal.com/mastering-c-name-mangling-and-symbol-decoration/
https://macronepal.com/c-no-linkage-mechanics-and-scope-isolation/
https://macronepal.com/understanding-c-internal-linkage-mechanics-and-architecture/
C Scope, Storage Classes & Typedef
https://macronepal.com/mastering-function-prototype-scope-in-c/
https://macronepal.com/c-function-scope-mechanics-and-visibility/
https://macronepal.com/understanding-c-file-scope-mechanics-and-architecture/
https://macronepal.com/mastering-c-scope-rules-for-predictable-name-resolution/
https://macronepal.com/c-scope-rules/
https://macronepal.com/mastering-c-register-storage-class-for-historical-context-and-modern-alternatives/
https://macronepal.com/mastering-_thread_local-in-c/
https://macronepal.com/c-extern-storage-class-mechanics-and-usage/
https://macronepal.com/understanding-the-c-static-storage-class-mechanics-and-usage/
https://macronepal.com/c-auto-storage-class/
https://macronepal.com/c-typedef-with-pointers/
Extra Articles
https://macronepal.com/13757-2/
https://macronepal.com/13748-2/
https://macronepal.com/13747-2/
https://macronepal.com/13746-2/
https://macronepal.com/13745-2/
https://macronepal.com/13708-2/
https://macronepal.com/13707-2/
https://macronepal.com/13702-2/
Online Compilers
https://macronepal.com/free-html-online-code-compiler/
https://macronepal.com/free-online-python-code-compiler/
https://macronepal.com/free-online-python2-code-compiler/
https://macronepal.com/free-online-java-code-compiler/
https://macronepal.com/free-online-javascript-code-compiler/
https://macronepal.com/free-online-node-js-code-compiler/
https://macronepal.com/free-online-c-code-compiler/
https://macronepal.com/free-online-c-code-compiler-2/
https://macronepal.com/free-online-c-code-compiler-3/
https://macronepal.com/free-online-php-code-compiler/
https://macronepal.com/free-online-ruby-code-compiler/
https://macronepal.com/free-online-perl-code-compiler/
https://macronepal.com/free-online-lua-code-compiler/
https://macronepal.com/free-online-tcl-code-compiler/
https://macronepal.com/free-online-groovy-code-compiler/
https://macronepal.com/free-online-j-shell-code-compiler/
https://macronepal.com/free-online-haskell-code-compiler/
https://macronepal.com/free-online-scala-code-compiler/
https://macronepal.com/free-online-common-lisp-code-compiler/
https://macronepal.com/free-online-d-code-compiler/
https://macronepal.com/free-online-ada-code-compiler/
https://macronepal.com/free-erlang-code-compiler/
https://macronepal.com/free-online-assembly-code-compiler/
Complete Guide to Core & Advanced C Programming Concepts (Functions, Strings, Arrays, Loops, I/O, Control Flow)
https://macronepal.com/bash/building-blocks-of-c-a-complete-guide-to-functions/
Explains how functions in C work as reusable blocks of code, including declaration, definition, parameters, return values, and modular programming structure.
https://macronepal.com/bash/the-heart-of-text-processing-a-complete-guide-to-strings-in-c-2/
Explains how strings are handled in C using character arrays, string manipulation techniques, and common library functions for text processing.
https://macronepal.com/bash/the-cornerstone-of-data-organization-a-complete-guide-to-arrays-in-c/
Explains arrays in C as structured memory storage for multiple values, including indexing, initialization, and efficient data organization.
https://macronepal.com/bash/guaranteed-execution-a-complete-guide-to-the-do-while-loop-in-c/
Explains the do-while loop in C, where the loop body executes at least once before checking the condition.
https://macronepal.com/bash/mastering-iteration-a-complete-guide-to-the-for-loop-in-c/
Explains the for loop in C, including initialization, condition checking, and increment/decrement for controlled iteration.
https://macronepal.com/bash/mastering-iteration-a-complete-guide-to-while-loops-in-c/
Explains the while loop in C, focusing on condition-based repetition and proper loop control mechanisms.
https://macronepal.com/bash/beyond-if-else-a-complete-guide-to-switch-case-in-c/
Explains switch-case statements in C, enabling multi-branch decision-making based on variable values.
https://macronepal.com/bash/mastering-conditional-logic-a-complete-guide-to-if-else-statements-in-c/
Explains if-else statements in C for decision-making and controlling program flow based on conditions.
https://macronepal.com/bash/mastering-the-fundamentals-a-complete-guide-to-arithmetic-operations-in-c/
Explains arithmetic operations in C such as addition, subtraction, multiplication, division, and operator precedence.
https://macronepal.com/bash/foundation-of-c-programming-a-complete-guide-to-basic-input-output/
Explains basic input and output in C using scanf and printf for interacting with users and displaying results.
Online C Code Compiler
https://macronepal.com/free-online-c-code-compiler-2/
