C Strings

What are Strings in C?

In C, a string is a sequence of characters stored in a character array, terminated by a null character (\0) . Unlike other languages, C has no built-in string data type—strings are just arrays of char.

String Representation in Memory

char str[] = "Hello";
// Memory layout:
// [H][e][l][l][o][\0]
// 0  1  2  3  4   5
// The null character marks the end

Declaring and Initializing Strings

#include <stdio.h>
int main() {
// Method 1: String literal (automatically adds \0)
char str1[] = "Hello";
// Method 2: Character array with size
char str2[10] = "Hello";
// Method 3: Character array without size
char str3[] = {'H', 'e', 'l', 'l', 'o', '\0'};
// Method 4: Fixed size (remaining are \0)
char str4[10] = {'H', 'e', 'l', 'l', 'o', '\0'};
// Method 5: Empty string
char empty[10] = "";
char empty2[10] = {'\0'};
printf("str1: %s\n", str1);
printf("str2: %s\n", str2);
printf("str3: %s\n", str3);
return 0;
}

String Input and Output

Basic Input/Output

#include <stdio.h>
int main() {
char name[50];
// Simple output
printf("Enter your name: ");
// Input (stops at first whitespace)
scanf("%s", name);  // Note: no & for array
printf("Hello, %s!\n", name);
return 0;
}

Problem with scanf (stops at space)

#include <stdio.h>
int main() {
char fullname[50];
printf("Enter full name: ");
scanf("%s", fullname);  // Only reads first word
printf("You entered: %s\n", fullname);  // "John" only, not "John Doe"
return 0;
}

Solution: fgets() for Full Line Input

#include <stdio.h>
int main() {
char fullname[50];
printf("Enter full name: ");
fgets(fullname, sizeof(fullname), stdin);  // Reads spaces
printf("Hello, %s", fullname);  // Note: fgets includes newline
return 0;
}

Removing Newline from fgets

#include <stdio.h>
#include <string.h>
int main() {
char fullname[50];
printf("Enter full name: ");
fgets(fullname, sizeof(fullname), stdin);
// Remove trailing newline
size_t len = strlen(fullname);
if(len > 0 && fullname[len-1] == '\n') {
fullname[len-1] = '\0';
}
printf("Hello, %s!\n", fullname);
return 0;
}

String Functions (string.h Library)

1. strlen() - Get String Length

#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello World";
int len = strlen(str);  // Returns 11 (doesn't count \0)
printf("Length: %d\n", len);
// Manual way (without string.h)
int manual_len = 0;
while(str[manual_len] != '\0') {
manual_len++;
}
printf("Manual length: %d\n", manual_len);
return 0;
}

2. strcpy() - Copy String

#include <stdio.h>
#include <string.h>
int main() {
char source[] = "Hello C Programming";
char destination[50];
// Copy source to destination
strcpy(destination, source);
printf("Source: %s\n", source);
printf("Destination: %s\n", destination);
// Manual copy
char manual[50];
int i = 0;
while(source[i] != '\0') {
manual[i] = source[i];
i++;
}
manual[i] = '\0';
printf("Manual copy: %s\n", manual);
return 0;
}

3. strcat() - Concatenate Strings

#include <stdio.h>
#include <string.h>
int main() {
char str1[50] = "Hello ";
char str2[] = "World!";
// Append str2 to str1
strcat(str1, str2);
printf("Concatenated: %s\n", str1);  // "Hello World!"
// Manual concatenation
char manual[50] = "Hello ";
char str3[] = "C Programming";
int j = strlen(manual);
int k = 0;
while(str3[k] != '\0') {
manual[j] = str3[k];
j++;
k++;
}
manual[j] = '\0';
printf("Manual: %s\n", manual);
return 0;
}

4. strcmp() - Compare Strings

#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Apple";
char str2[] = "Apple";
char str3[] = "Banana";
// Returns 0 if strings are equal
if(strcmp(str1, str2) == 0) {
printf("str1 and str2 are equal\n");
}
// Returns negative if str1 < str3
int result = strcmp(str1, str3);
printf("Compare Apple vs Banana: %d\n", result);  // Negative
// Returns positive if str3 > str1
result = strcmp(str3, str1);
printf("Compare Banana vs Apple: %d\n", result);  // Positive
// Manual comparison
int i = 0;
while(str1[i] == str2[i] && str1[i] != '\0') {
i++;
}
if(str1[i] == str2[i]) {
printf("Manually equal\n");
}
return 0;
}

5. strchr() - Find Character

#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello World";
// Find first occurrence of 'o'
char *ptr = strchr(str, 'o');
if(ptr != NULL) {
printf("Found 'o' at position: %ld\n", ptr - str);  // 4
printf("Rest of string: %s\n", ptr);
}
return 0;
}

6. strstr() - Find Substring

#include <stdio.h>
#include <string.h>
int main() {
char str[] = "The quick brown fox jumps";
// Find substring "brown"
char *ptr = strstr(str, "brown");
if(ptr != NULL) {
printf("Found at position: %ld\n", ptr - str);
printf("From found point: %s\n", ptr);
} else {
printf("Substring not found\n");
}
return 0;
}

Common String Operations

Reading and Manipulating Strings

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main() {
char str[100];
printf("Enter a sentence: ");
fgets(str, sizeof(str), stdin);
// Remove newline
str[strcspn(str, "\n")] = '\0';
// Convert to uppercase
for(int i = 0; str[i] != '\0'; i++) {
str[i] = toupper(str[i]);
}
printf("Uppercase: %s\n", str);
// Count vowels
int vowels = 0;
for(int i = 0; str[i] != '\0'; i++) {
char c = tolower(str[i]);
if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
vowels++;
}
}
printf("Vowels: %d\n", vowels);
// Reverse string
int len = strlen(str);
for(int i = 0; i < len/2; i++) {
char temp = str[i];
str[i] = str[len-1-i];
str[len-1-i] = temp;
}
printf("Reversed: %s\n", str);
return 0;
}

Practical Example 1: String Palindrome Check

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int isPalindrome(char str[]) {
int left = 0;
int right = strlen(str) - 1;
while(left < right) {
// Skip non-alphabetic characters
while(left < right && !isalpha(str[left])) left++;
while(left < right && !isalpha(str[right])) right--;
// Compare ignoring case
if(tolower(str[left]) != tolower(str[right])) {
return 0;  // Not palindrome
}
left++;
right--;
}
return 1;  // Is palindrome
}
int main() {
char str1[] = "A man a plan a canal panama";
char str2[] = "Hello World";
// Remove spaces for testing
printf("Testing: \"%s\"\n", str1);
if(isPalindrome(str1)) {
printf("Is a palindrome!\n");
} else {
printf("Not a palindrome\n");
}
printf("\nTesting: \"%s\"\n", str2);
if(isPalindrome(str2)) {
printf("Is a palindrome!\n");
} else {
printf("Not a palindrome\n");
}
return 0;
}

Practical Example 2: String Tokenization

#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Apple,Banana,Cherry,Date";
char *token;
printf("Original: %s\n", str);
printf("Tokens:\n");
// strtok modifies the original string
token = strtok(str, ",");
while(token != NULL) {
printf("- %s\n", token);
token = strtok(NULL, ",");
}
return 0;
}

Output:

Original: Apple,Banana,Cherry,Date
Tokens:
- Apple
- Banana
- Cherry
- Date

Array of Strings (2D Character Array)

#include <stdio.h>
#include <string.h>
int main() {
// Array of strings (3 strings, max 20 chars each)
char fruits[3][20] = {
"Apple",
"Banana",
"Cherry"
};
// Print all fruits
for(int i = 0; i < 3; i++) {
printf("Fruit %d: %s\n", i+1, fruits[i]);
}
// Modify a string
strcpy(fruits[1], "Blueberry");
printf("\nAfter modification:\n");
for(int i = 0; i < 3; i++) {
printf("Fruit %d: %s\n", i+1, fruits[i]);
}
return 0;
}

String Literals vs Character Arrays

#include <stdio.h>
#include <string.h>
int main() {
// Character array (modifiable)
char str1[] = "Hello";
str1[0] = 'J';  // OK - becomes "Jello"
printf("str1: %s\n", str1);
// String literal (read-only - can cause crash)
char *str2 = "World";
// str2[0] = 'J';  // BAD! Undefined behavior
// Correct way: str2 points to first character
printf("str2: %s\n", str2);
// Copy literal to array for modification
char buffer[20];
strcpy(buffer, "Hello World");
buffer[0] = 'M';  // OK
printf("buffer: %s\n", buffer);
return 0;
}

Common String Pitfalls

#include <stdio.h>
#include <string.h>
int main() {
// PITFALL 1: Forgetting null terminator
char bad[3] = {'A', 'B', 'C'};  // No \0 - NOT a string!
// printf("%s", bad);  // Dangerous! Prints until random \0
char good[4] = {'A', 'B', 'C', '\0'};  // Proper string
printf("Good: %s\n", good);
// PITFALL 2: Buffer overflow
char small[5];
// strcpy(small, "This is too long");  // BAD! Overflow
// Use strncpy for safety
strncpy(small, "This is too long", 4);
small[4] = '\0';  // Manually null terminate
printf("Safe copy: %s\n", small);
// PITFALL 3: Comparing strings with ==
char str1[] = "Hello";
char str2[] = "Hello";
if(str1 == str2) {  // WRONG! Compares addresses, not content
printf("This won't print\n");
}
if(strcmp(str1, str2) == 0) {  // CORRECT
printf("Correct comparison\n");
}
return 0;
}

Quick Reference Table

FunctionPurposeExample
strlen(s)Length of stringint len = strlen("Hi"); // 2
strcpy(dest, src)Copy src to deststrcpy(dest, "Hello");
strcat(dest, src)Append src to deststrcat(str, " World");
strcmp(s1, s2)Compare stringsif(strcmp(a, b) == 0)
strchr(s, c)Find char in stringchar *p = strchr(str, 'a');
strstr(s, sub)Find substringchar *p = strstr(str, "sub");
strtok(s, del)Split stringtoken = strtok(str, ",");
strncpy(dest, src, n)Copy n charsstrncpy(dest, src, 5);
strncat(dest, src, n)Append n charsstrncat(dest, src, 3);
strncmp(s1, s2, n)Compare n charsif(strncmp(a, b, 3) == 0)

Key Points

  • Strings are char arrays terminated by \0 (null character)
  • Use double quotes for string literals: "text"
  • Include <string.h> for string functions
  • Always ensure enough space for null terminator
  • fgets() is safer than scanf() for input with spaces
  • Strings are 0-indexed like arrays
  • Never compare strings with ==—use strcmp()

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/

Leave a Reply

Your email address will not be published. Required fields are marked *


Macro Nepal Helper